有关实时数据聚合的设计建议?

toa*_*ven 5 c# real-time aggregation

我希望建立在C#中的一些数据汇总的东西,我想一个类似于实时数据透视表,或某种形式的不断更新SQL查询,与支持selectsumaveragefirstwhere,和group-by(其中first在LINQ的“给我第一价值”的意义)。

例如,我可能有某种形式的表对象的所谓Trans的列NameDateTotal,并呼吁另一个表Price的列NamePrice。我想创建某种Query实例(在伪SQL中)

select Name, sum(Total), first(Price) from Trans, Price join on Name group by Name
Run Code Online (Sandbox Code Playgroud)

并将其传递给Aggregator具有指向数据源链接的实例。与此同时,我想注册一个在查询产生的行发生更改时命中的回调。因此,如果名为“ XYZ”的实体的价格发生变化,则回调将触发一个对象,该对象包含该汇总行的新值。我还希望Aggregator尽可能高效,因此它将有某种索引方案,因此无论何时值更改都不需要进行表扫描。

我不太确定该怎么称呼,并且我希望能够完全用C#来实现某些东西,前提是它并不比我想象的要复杂一个数量级。我已经读过Continuous LINQ和Bindable LINQ,但是我真的无法感觉是否适合这个问题,或者是否存在性能问题(例如,只要值改变,LINQ聚合就会枚举整个表)。

有谁知道一个项目可以执行类似的工作,或者对自己设计/构建有任何建议?

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

Ada*_*rth 3

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

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

我认为从结构上来说,如果将总和存储在数据库中,您也可能会遇到问题 - 例如锁定问题。我会始终将这些价值观牢记在心。

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

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