给定像StackOverflow这样的网站,最好创建num_comments列来存储提交的注释数量,然后在发表评论时更新它,或者仅使用COUNT函数查询行数?看起来后者会更具可读性和优雅性,但前者会更有效率。 SO的想法是什么?
答案 0 :(得分:8)
绝对要使用COUNT。存储评论的数量是经典的去标准化,会产生令人头疼的问题。它的检索效率稍高,但使插入更加昂贵:每个新注释不仅需要插入注释表,还需要对包含注释计数的行进行写锁定。
答案 1 :(得分:3)
前者未规范化,但会产生更好的性能(假设读取次数多于写入次数)。
后者更加规范化,但需要更多资源,因此性能较差。
哪个更好归结为应用程序要求。
答案 2 :(得分:2)
我建议计算评论记录。虽然另一种方法会更快,但它可以提供更清洁的数据库。添加计数列将是一种数据重复,更不用说需要额外的代码步骤和插入。
如果你期望有数百万条评论,那么你可能想要选择计数列方法。
答案 3 :(得分:2)
我同意@Oded。这取决于应用程序的要求以及网站的活跃程度,但这也是我的两分钱
答案 4 :(得分:2)
设计的“正确”方法是使用另一个表,加入它并COUNT
。这与database normalization教授的内容一致。
规范化的问题在于它无法扩展。皮肤猫只有很多方法,所以如果你每天有数百万个查询,其中很多都涉及表X,那么数据库性能就会低于地面,因为服务器还必须处理并发写入,事务等。
要解决这个问题,通常的做法是sharding。分片的副作用是表格的行不存储在同一个物理位置,这样做的主要结果是你不能再JOIN
;你怎么能JOIN
反对半桌并获得有意义的结果?显然,尝试JOIN
对抗表格的所有分区并合并结果将比疾病更糟糕。
因此,您可以看到,不仅您在实践中使用的替代方案用于实现高性能,而且还有工程师可以采取的更为激进的步骤。
当然,除非你做有性能问题,否则分片甚至去标准化只会让你的生活更加艰难,没有任何实际的好处。