nfm*_*nfm 5 mysql database ruby-on-rails query-optimization denormalization
我正在使用Rails和MySQL,并且有一个基于行计数的效率问题.
我有一个Project
模型has_many :donations
.
我想计算一个项目的独特捐赠者数量.
在projects
表中有一个字段被调用num_donors
,并在创建新的捐赠者时增加它是一个好主意吗?
或者@num_donors = Donor.count(:select => 'DISTINCT user_id')
由于数据库优化,在效率方面类似或相似?这是否需要我为user_id
我想要计算的任何其他字段创建索引?
总结捐赠总额的答案是否相同?
Joh*_*nFx 10
回答标题问题.是的,它是多余的,但你是否应该这样做取决于你的情况.
除非您知道性能问题,否则请在应用程序中动态计算计数和总计,不要存储它们.也就是说,除非您没有其他选择,否则不要存储计算值.
在大多数情况下,你不必诉诸于此而不应该这样做.
如果必须存储计算值,请执行以下操作:
请记住这句格言"有一只手表的男人总能知道时间.一个有两只手表的男人永远不会确定." 我只会存储派生的数字,如果:
性能问题阻止您在需要时获取派生数字(在这种情况下这不应该是一个问题,因为答案很可能从索引中获得)
要么
您有理由相信您通过程序员错误或故意或意外的用户操作丢失了主表中的记录.在这种情况下,您可以使用派生的数字来审核当前计算的数字.
Peter 和 JohnFx 的答案是合理的,您建议的是数据库模式的非规范化,这可以提高读取性能,但会损害写入,同时另外将责任放在开发人员(或其他 DBMS 聪明人)身上,以防止您的数据库中出现不一致。数据集。
ActiveRecord 有一些内置功能可以自动管理has_many
关系计数。查看计数器缓存上的 Railscast。
归档时间: |
|
查看次数: |
954 次 |
最近记录: |