哪个更好的数据库设计?

时间:2011-03-17 20:59:08

标签: php mysql sql database-design

给定像StackOverflow这样的网站,最好创建num_comments列来存储提交的注释数量,然后在发表评论时更新它,或者仅使用COUNT函数查询行数?看起来后者会更具可读性和优雅性,但前者会更有效率。 SO的想法是什么?

5 个答案:

答案 0 :(得分:8)

绝对要使用COUNT。存储评论的数量是经典的去标准化,会产生令人头疼的问题。它的检索效率稍高,但使插入更加昂贵:每个新注释不仅需要插入注释表,还需要对包含注释计数的行进行写锁定。

答案 1 :(得分:3)

前者未规范化,但会产生更好的性能(假设读取次数多于写入次数)。

后者更加规范化,但需要更多资源,因此性能较差。

哪个更好归结为应用程序要求。

答案 2 :(得分:2)

我建议计算评论记录。虽然另一种方法会更快,但它可以提供更清洁的数据库。添加计数列将是一种数据重复,更不用说需要额外的代码步骤和插入。

如果你期望有数百万条评论,那么你可能想要选择计数列方法。

答案 3 :(得分:2)

我同意@Oded。这取决于应用程序的要求以及网站的活跃程度,但这也是我的两分钱

  • 我会尽量避免必须由触发器执行的写操作,在添加新注释时更新发布表。
  • 如果您担心报告数据,请不要在事务系统上执行此操作。创建报告数据库并定期更新。

答案 4 :(得分:2)

设计的“正确”方法是使用另一个表,加入它并COUNT。这与database normalization教授的内容一致。

规范化的问题在于它无法扩展。皮肤猫只有很多方法,所以如果你每天有数百万个查询,其中很多都涉及表X,那么数据库性能就会低于地面,因为服务器还必须处理并发写入,事务等。

要解决这个问题,通常的做法是sharding。分片的副作用是表格的行不存储在同一个物理位置,这样做的主要结果是你不能再JOIN;你怎么能JOIN反对半桌并获得有意义的结果?显然,尝试JOIN对抗表格的所有分区并合并结果将比疾病更糟糕。

因此,您可以看到,不仅您在实践中使用的替代方案用于实现高性能,而且还有工程师可以采取的更为激进的步骤。

当然,除非你有性能问题,否则分片甚至去标准化只会让你的生活更加艰难,没有任何实际的好处。