例如,我们的应用程序跟踪农场的动物移动和价格。要获得当前的库存计数,最简单的解决方案是使用起始编号,然后将所有移动加起来,直到我们有一个当前编号。但这是内存密集型的,随着移动次数逐年增加,速度越来越慢。
我们没有“冻结”一年的奢侈品,因此无法再接受更改,系统必须能够在任何时间点处理动作的变化,然后实时显示更新的数字。 / p>
这不仅仅是股票数量;我们必须跟踪大量这样的变量,并为每个时期(日,周,月,年)编写报告,其中包括基于这些变量的汇总计算。
为了计算和报告目的,处理跨越多年的数据流的最常见,首选,“最佳”,最快速,最优雅的方法是什么?在这种情况下,数据库设计和体系结构将如何相关(即,只要数据库模式设计得很好,使用ORM就可以了)。这里的关键要求是最佳性能和实时可用性。
我已经在大规模系统中看到过这种工作被分成时间片,例如周,月,年聚合表。如果有一个共同的设计模式来解决这个问题我特别感兴趣。
答案 0 :(得分:1)
我会使用SQL数据库(PostgreSQL)。 RDBMS对这些事情非常快:)
将所有历史记录作为ORM对象拉出,然后对其进行求和,从长远来看,应用程序可能无效。您将不得不使用SQL查询来完成RDBMS内部的大部分统计工作。您当然可以使用ORM来显示和编辑对象。
我认为解决方案应该对预期的数据量非常安全,并且可以通过适当的索引和更多的内存来扩展RDBMS。
您也可以预先制作大量随机数据和测试可扩展性。
答案 1 :(得分:1)
可能只有一种通用方法 - 拆分工作。
您可以将及时拆分并在低负载的某段时间内定期计算聚合,并将它们存储在单独的表中。对于某些聚合函数,您甚至可以从短期聚合中计算长周期聚合,而不会丢失精度。
您也可以将其分解为在空间 - 有使用分布式数据库和map-reduce引擎的组合的解决方案 - 例如,请查看Apache Pig。这种方法需要大量的学习和学习,但你应该获得更好的可扩展性。
您首先要知道的是读取:写入比率以及您要运行的查询类型。
答案 2 :(得分:1)