ruby-on-rails - 计数/总和等的最佳数据库实践

标签 ruby-on-rails database postgresql

我想知道在存储计数/总和等方面的最佳做法是什么?在每个页面加载时即时计算是一个很大的禁忌吗?

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

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

另一种启用过滤的解决方案是创建第三个表,其中包含每种产品的每日总和吗?对于每个产品,主销售表每天可能包含多个,有时数千行,因此我再次看到主销售表的压缩版本如何也可以加快处理速度。

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

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

提前致谢!

最佳答案

很好的问题。

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

销售数据很重要,因为虽然它有时可以在短时间内进行调整,但过了一段时间后,如果没有犯规,它就再也不会调整了(这是在账簿关闭之后)。销售账簿通常每月或每年关闭一次。

您可以做的是将聚合放入带有日期或最大 ID 等的关闭条目中,并放入触发器,以便您可以确保没有条目被添加到关闭期间。这允许您从已知的良好值(value)前滚您的聚合。在这种情况下,您可能仅在关闭期间或开放期间内聚合。

关于ruby-on-rails - 计数/总和等的最佳数据库实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14871197/

相关文章:

ruby-on-rails - 是否可以连接到 Linux 上的 MS Access DB?

ruby-on-rails - Rails 运行程序不发送邮件

ruby-on-rails - 搜索栏 Ruby On Rails 的问题

php - 如何在 Laravel 中获取数据库字段类型?

PostgreSQL 流式复制

ruby-on-rails - FactoryGirl 所属协会

database - 如何重新设计这个SQL数据结构?

android - 如何让 SQLite.net 与 Mono Android 一起工作?

postgresql - 在不锁定表的情况下回收磁盘空间 - PostgreSQL 10

javascript - 如何将 2 个 postgres 数据库连接到我的应用程序?