Php 哪个数据库设计更好?

Php 哪个数据库设计更好?,php,mysql,sql,database-design,Php,Mysql,Sql,Database Design,对于StackOverflow这样的站点,最好创建num_comments列来存储提交的评论数量,然后在发表评论时进行更新,还是只使用COUNT函数查询行数?看起来后者更具可读性和优雅性,但前者效率更高。这是怎么想的?前者不是标准化的,但会产生更好的性能(假设读比写多得多) 后者更规范化,但需要更多资源,因此性能较差 这最好归结为应用程序需求。一定要使用COUNT。存储注释的数量是一个经典的去规范化过程,会带来麻烦。它的检索效率略高,但插入的成本却更高:每个新注释不仅需要插入到注释表中,还需要在

对于StackOverflow这样的站点,最好创建num_comments列来存储提交的评论数量,然后在发表评论时进行更新,还是只使用COUNT函数查询行数?看起来后者更具可读性和优雅性,但前者效率更高。这是怎么想的?

前者不是标准化的,但会产生更好的性能(假设读比写多得多)

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


这最好归结为应用程序需求。

一定要使用COUNT。存储注释的数量是一个经典的去规范化过程,会带来麻烦。它的检索效率略高,但插入的成本却更高:每个新注释不仅需要插入到注释表中,还需要在包含注释计数的行上设置写锁。

我建议计算注释记录。尽管另一种方法速度更快,但它有助于创建更干净的数据库。添加计数列将是一种数据复制,更不用说需要额外的代码步骤和插入


如果你预计会有数百万条评论,那么你可能需要选择计数列方法。

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

  • 我会尽量避免在添加新注释时必须通过触发器、更新post表来完成的写入操作
  • 如果您担心报告数据,那么不要在事务系统上这样做。创建一个报告数据库并定期更新
设计的“正确”方法是使用另一个表,连接它并
计数
。这与教学内容是一致的

标准化的问题在于它无法扩展。剥猫皮的方法只有这么多,因此,如果每天有数百万个查询,并且其中很多查询涉及表X,那么数据库的性能就会下降,因为服务器还必须处理并发写入、事务等

为了解决这个问题,通常的做法是。切分的副作用是表中的行不存储在相同的物理位置,其主要结果是您不能再
JOIN
;如何对半个表进行
联接
,并获得有意义的结果?显然,试图对一个表的所有分区进行
连接并合并结果将比疾病更糟糕

因此,您可以看到,不仅您所研究的替代方案在实践中被用于实现高性能,而且工程师还可以并且确实采取更激进的步骤


当然,除非您确实存在性能问题,否则切分甚至取消规范化只会让您的生活变得更加艰难,而没有任何实际的好处。

如果需要连接表以显示注释计数,则切分甚至取消规范化是不存在的。但是,如果担心你的网站每天会被数百万的页面浏览量击中,那就太早了——所以在你自己的项目中,使用
COUNT
。不要过早地优化。保持数据库正常化,直到您需要对其进行非标准化。@Jon:有趣……您能详细说明或提供链接吗?我是关系模型之外的疯子,但我随时准备学习…@iDevlop:提交了答案,看一看。这是如何向包括num_评论栏倾斜的?这不是非规范化,更是一种优化,需要一些触发因素-几乎不令人头痛@JonBlack-是的,这是一个优化(尽管,正如我在回答中所说,“优化”是否值得还不太清楚)。同时,它肯定是一种非规范化。具体来说,
num_comments
列违反了第三种标准形式,因为它引入了非键依赖关系——一个不依赖于键的值,但在本例中,该值很可能来自完全不同的表。至于令人头痛的问题,问题不仅仅是编写“几个触发器”,而且还必须随着数据库的发展维护触发器和其他一切。