繁体   English   中英

哪个更好的数据库设计?

[英]Which is better database design?

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

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

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

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

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

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

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

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

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

设计的“正确”方法是使用另一个表,加入它和COUNT 这与数据库规范化教授的内容一致。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM