我正在做一些不同的事情,但这是一个比较容易理解的例子。想想这里的选票。我将这些选票添加到单独的表格中,并根据他们的姓名,时间等等记录他们的相关信息。您是否还会在主表中添加一个字段,以简单计数投票数量,或者这是不正确的做法。我应该在主关系表中添加总计数
回答
这就是所谓的“denormalization”,被认为是不好的做法除非您在非规范化得到显著的性能提升。
然而,最大的问题是并发性。如果两个人在投票中投票并且他们都尝试增加VoteCount
列,会发生什么情况?
在这里和谷歌搜索非规范化,已经有很多关于这个话题的讨论。找到最适合你的确切情况的东西,尽管从外观上看,反规范化在你的情况下是过早的优化。
简短答案是YES。但是您应该记住,重复可能会成为您系统开发和维护的麻烦甚至是噩梦。如果您想要存储一些预先计算的缓存值以提高性能,缓存的计算过程应该被封装并且对其他进程是透明的。
在这种情况下:
解决方法1:如果在投票一个用户投票中,详细信息将被记录,并且计票应该会自动增加一个。 (即,高速缓存计算被封装在数据写入器过程中)。
解决方案2:当投票信息被记录时,投票计数无关,只有一个标志将被改变,以将投票计数值标记为现在变脏。当阅读投票计数时,如果它的值很脏,计算它并更新它的值和标志;如果它的值是最新的(不是脏的),请直接阅读它。 (即,高速缓存计算被封装在数据读取器过程中)。
阅读着名书籍第7部分务实程序员,您可能会有一些想法。
实际上,数据库设计中使用的范式是原理的一个特例。
总之,没有意义可以存储可以用COUNT查询获取的数据,第二个原因是您必须手动操作计数器值 - 更多的工作,更大的问题可能性,您必须保持该代码/算法。真的不要这样做,这是一个不好的做法。
不好。
不正确。
保证问题和数据不一致。投票计数是“派生数据”,不应存储(重复)。对于稳定的数据(不变的数据),总结很合理。
现在,如果数据(没有投票)很大,并且您需要经常(在查询中)对它们进行计数,那么单独增强表单的主表的速度,例如确保有一个索引在列被查找计数。
如果数据是海量。例如。一家银行每个月都有数百万笔交易,而且您不希望对它们进行计数,以便在每个查询中产生帐户余额,从而提升这一点。例如。我每晚计算一个月迄今的数字并将其存储在帐户级别;需要计算日数,并添加到MTD数据中,以产生真实的最新数字。在当月月底,当所有审计流程在一个月内都会更改各行时,MTD数据(至昨天)可以按需执行。
- 1. 子总计关系的数据表
- 2. 我应该添加NetCoreapp作为依赖关系
- 3. 我应该如何在Java中表示依赖关系图?
- 4. 我应该在php.ini中添加extension = mcrypt.so?
- 5. 在规则中添加一个依赖关系而不会将依赖关系附加到总列表中
- 6. 如果在数组中,添加关系,否则删除关系
- 7. 我应该如何准备添加性能计数器?
- 8. 在每一行旁边添加一个总数,表示小计总计
- 9. 关系数据库设计 - 一个表中的双主键?
- 10. 我如何表示我在关系代数中的加入?
- 11. 我应该添加一个ID为许多一对多的关系表在我的asp.net MVC
- 12. 我应该如何设计多对多关系类?
- 13. 计数关系表行
- 14. 添加关系
- 15. Javascript库应该动态添加依赖关系吗?
- 16. 在学说中更新总关系计数器
- 17. 从MSSQL中的多个表中总计每日总计加总计总计
- 18. 我在哪里可以在Cloudsim中添加总和计算
- 19. SSRS表达式 - 每页添加总计
- 20. 在表的列的动态数末尾添加总计栏
- 21. 我应该在linq-to-sql中选择哪种关系?
- 22. 在Ambari安装选项中,我应该添加Ambari-Server IP /主机名?
- 23. 为什么我应该使用主ID作为关联表
- 24. mysql中设计表中的主从关系
- 25. 通过在mysql表中添加值来查找多个总计
- 26. 在计划中添加嵌套列表的总和
- 27. 如何在交叉表中添加行/列总计?
- 28. 应该添加哪个权限才能添加联系人?
- 29. 将总计添加到组
- 30. 向MDX添加总计列
所以,你的意思是,即使像这里这样的大网站,每次这样的页面被调用时,都必须从原始投票表中算起来? – samquo 2010-10-22 02:11:43
是的,一些大的网站确实在运行,其他一些大的网站却没有。两者都有权衡。只有当你注意到你的网站由于计数而特别慢,那么你应该看看反规范化是否有帮助。 – Omar 2010-10-22 03:19:31