计数/总和的最佳数据库实践等

时间:2013-02-14 09:08:38

标签: ruby-on-rails database postgresql

我想知道存储计数/总和等方面的最佳做法是什么?在每个页面上计算加载一个大不是没有?

我有一个Rails应用程序,其中包含来自多个来源的产品和销售报告。其中一些销售报告可以扩展到每天10万+行。目前,我们正在为每个页面加载计算。这显然非常缓慢。

由于销售报告几乎肯定是一次写入但多次读取,否则最好在我的产品表中添加一个总和列,并在每次新销售时增加销售量?我可以看到这显然会更快,但它严重限制了我提供日期过滤的能力; “过去7天排名前10位”等。

另一种能够过滤的解决方案是创建第三个表,每个产品的每日总和是多少?主销售表每天可以包含多个(有时是几千行)每个产品,所以我再次看到主销售表的精简版本如何加快速度。

我应该在导入期间使用before / after_save回调/进行这些计算,还是应该查看在后台运行的计划任务?

任何人都可以提供一些建议或推荐阅读,以帮助我走上正确的道路并帮助我改善令人尴尬的慢页面加载时间吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

很棒的问题。

一般来说,我认为最好先生成计数和总和。这遵循了Codd的规则等。问题是随着时间的推移,这可能会变慢。你如何处理它将取决于很多事情。我将为您提供处理销售数据的解决方案,以及为什么我认为这是理想的。

销售数据非常重要,因为虽然有时可以在短时间内对其进行调整,但不会在没有任何违规行为的情况下进行调整(这是在书籍关闭后)。销售书籍通常每月或每年关闭。

您可以做的是将聚合放在具有日期或最大ID等的结束条目中,并放入触发器,以便您可以确保没有条目被添加到关闭期间。这允许您从已知的良好值前滚聚合。在这种情况下,您可能只会在关闭期间或未结期间汇总。