针对实时数据聚合的设计建议?

时间:2010-07-14 15:55:58

标签: c# real-time aggregation

我正在寻找在C#中构建一些数据聚合的东西,我想要一些类似于实时数据透视表的东西,或某种不断更新的SQL查询,支持select,{ {1}},sumaveragefirstwheregroup-by处于LINQ意义上的“给我第一个值”)

例如,我可能有一个名为first的表对象,其中列为TransNameDate,另一个表为TotalPriceName。我想创建某种{(1}}实例(使用伪SQL)

Price

并将其传递给具有数据源链接的Query实例。除此之外,我想注册一个回调,只要查询产生的行发生变化就会被调用。因此,如果名为“XYZ”的实体的价格发生变化,则回调将触发一个包含该聚合行的新值的对象。我也希望select Name, sum(Total), first(Price) from Trans, Price join on Name group by Name 尽可能高效,因此它会有某种索引方案,因此只要值发生变化就不需要进行表扫描。

我不太确定该怎么称呼这个东西,我希望能够完全用C#实现一些东西,假设它不比我想象的那么复杂。我已经阅读了关于Continuous LINQ和Bindable LINQ的内容,但是我无法真正意识到是否适合这个问题,或者是否存在性能问题(例如,只要值发生变化,就会在整个表中枚举LINQ聚合)。

是否有人知道我可以查看的类似项目的项目,或者有关于如何自行设计/构建项目的建议?

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

3 个答案:

答案 0 :(得分:3)

第一个替代解决方案是使用基础数据更改进行聚合 - 即,当我更新总计记录时,也要更新总计。要以这种方式执行此操作,您将需要旧值,然后它还会增加对聚合值所做的任何更改的开销。但是,如果要汇总现有数据的整体目的,那么它可能是一个可行的选择。

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

我认为从结构上来说,如果总和存储在数据库中,您可能会遇到问题 - 例如锁定问题。我总是将这些值保存在记忆中。

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

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

答案 1 :(得分:1)

您是否看过Push LinqReactive Extensions (Rx)

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

有关Rx的更多信息,请访问DevLabs网站:

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

答案 2 :(得分:0)

还有一个更积极开发的名为OLinq的项目,您也可以尝试

http://nuget.org/packages/OLinq