2010-10-22 49 views
1

我正在做一些不同的事情,但这是一个比较容易理解的例子。想想这里的选票。我将这些选票添加到单独的表格中,并根据他们的姓名,时间等等记录他们的相关信息。您是否还会在主表中添加一个字段,以简单计数投票数量,或者这是不正确的做法。我应该在主关系表中添加总计数

回答

6

这就是所谓的“denormalization”,被认为是不好的做法除非您在非规范化得到显著的性能提升。

然而,最大的问题是并发性。如果两个人在投票中投票并且他们都尝试增加VoteCount列,会发生什么情况?

在这里和谷歌搜索非规范化,已经有很多关于这个话题的讨论。找到最适合你的确切情况的东西,尽管从外观上看,反规范化在你的情况下是过早的优化。

+0

所以,你的意思是,即使像这里这样的大网站,每次这样的页面被调用时,都必须从原始投票表中算起来? – samquo 2010-10-22 02:11:43

+0

是的,一些大的网站确实在运行,其他一些大的网站却没有。两者都有权衡。只有当你注意到你的网站由于计数而特别慢,那么你应该看看反规范化是否有帮助。 – Omar 2010-10-22 03:19:31

1

简短答案是YES。但是您应该记住,重复可能会成为您系统开发和维护的麻烦甚至是噩梦。如果您想要存储一些预先计算的缓存值以提高性能,缓存的计算过程应该被封装并且对其他进程是透明的。

在这种情况下:

解决方法1:如果在投票一个用户投票中,详细信息将被记录,并且计票应该会自动增加一个。 (即,高速缓存计算被封装在数据写入器过程中)。

解决方案2:当投票信息被记录时,投票计数无关,只有一个标志将被改变,以将投票计数值标记为现在变脏。当阅读投票计数时,如果它的值很脏,计算它并更新它的值和标志;如果它的值是最新的(不是脏的),请直接阅读它。 (即,高速缓存计算被封装在数据读取器过程中)。

阅读着名书籍第7部分务实程序员,您可能会有一些想法。

实际上,数据库设计中使用的范式是原理的一个特例。

0

总之,没有意义可以存储可以用COUNT查询获取的数据,第二个原因是您必须手动操作计数器值 - 更多的工作,更大的问题可能性,您必须保持该代码/算法。真的不要这样做,这是一个不好的做法。

2

不好。

不正确。

保证问题和数据不一致。投票计数是“派生数据”,不应存储(重复)。对于稳定的数据(不变的数据),总结很合理。

现在,如果数据(没有投票)很大,并且您需要经常(在查询中)对它们进行计数,那么单独增强表单的主表的速度,例如确保有一个索引在列被查找计数。

如果数据是海量。例如。一家银行每个月都有数百万笔交易,而且您不希望对它们进行计数,以便在每个查询中产生帐户余额,从而提升这一点。例如。我每晚计算一个月迄今的数字并将其存储在帐户级别;需要计算日数,并添加到MTD数据中,以产生真实的最新数字。在当月月底,当所有审计流程在一个月内都会更改各行时,MTD数据(至昨天)可以按需执行。