【问题标题】:Design suggestions for real-time data aggregation?实时数据聚合的设计建议?
【发布时间】:2011-03-15 22:52:09
【问题描述】:

我正在寻找在 C# 中构建一些数据聚合的东西,我想要类似于实时数据透视表的东西,或者某种持续更新的 SQL 查询,支持selectsumaveragefirstwheregroup-by(其中first 是 LINQ 意义上的“给我第一个值”)。

例如,我可能有一个名为Trans 的表对象,其列NameDateTotal,以及另一个名为Price 的表,其列NamePrice .我想创建某种 Query 实例来执行(在伪 SQL 中)

select Name, sum(Total), first(Price) from Trans, Price join on Name group by Name

并将其传递给具有数据源链接的Aggregator 实例。除此之外,我想注册一个回调,只要查询产生的行发生更改,就会触发该回调。因此,如果名为“XYZ”的实体的价格发生变化,回调将触发一个包含该聚合行的新值的对象。我还希望Aggregator 尽可能高效,因此它会有某种索引方案,这样每当值发生变化时就不需要进行表扫描。

我不太确定如何称呼这种东西,我希望能够完全在 C# 中实现一些东西,假设它没有比我想象的复杂一个数量级。我已经阅读了有关 Continuous LINQ 和 Bindable LINQ 的信息,但我真的不知道它们是否适合这个问题,或者是否存在性能问题(例如,每当值更改时,LINQ 聚合就会在整个表中枚举)。

有没有人知道我可以查看的执行此类操作的项目,或者对如何自己设计/构建它有建议?

编辑:我应该注意,数据实际上不会在数据库中,而是在内存中。

【问题讨论】:

    标签: c# real-time aggregation


    【解决方案1】:

    第一个替代解决方案是使用基础数据更改进行聚合 - 即,当我更新总计记录时,也去更新总计。要做到这一点,您将需要旧值,但它也会增加您对聚合值所做的任何更改的开销。但是,如果要汇总现有数据的全部目的,它可能是一个可行的选择。

    我使用我的银行余额应用程序执行此操作,每当我插入/修改/删除交易时,逻辑也会更新帐户余额,因为余额会被多次搜索,并且在有很多交易时计算起来很快就会变得昂贵。

    如果总和存储在数据库中,我认为在结构上您也可能会遇到问题 - 例如锁定问题。我会一直将这些值保存在内存中。

    更新:另一种可能的解决方案是通过维护层传递数据访问代码,该维护层将聚合值保存在内存中 - 这将非常快速,并且在插入/更新/删除底层时几乎为零开销数据。您还可以变得聪明,让这一层可交易,因此如果数据访问操作失败,您可以回滚聚合更改。

    唯一的缺点是数据库更改必须经过层以避免使聚合失效,并且需要在首次运行或重新启动时从数据库初始化。

    【讨论】:

      【解决方案2】:

      你看过Push LinqReactive Extensions (Rx)吗?

      虽然我都没有使用过,但我相信两者都允许您在流数据上使用 LINQ 运算符。

      更多关于 Rx 的信息可以在 DevLabs 网站上找到:

      http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

      【讨论】:

        【解决方案3】:

        还有一个开发更积极的项目叫做 OLinq 你也可以试试

        http://nuget.org/packages/OLinq

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-22
          相关资源
          最近更新 更多