假设有一个像StackOverflow这样的网站,是创建一个num_comments列来存储提交的评论数量,然后在每次发表评论时更新它还是只使用COUNT函数查询有多少行更好呢?使用COUNT函数似乎更易读和优雅,但使用前者更有效率。SO网站认为什么?
假设有一个像StackOverflow这样的网站,是创建一个num_comments列来存储提交的评论数量,然后在每次发表评论时更新它还是只使用COUNT函数查询有多少行更好呢?使用COUNT函数似乎更易读和优雅,但使用前者更有效率。SO网站认为什么?
使用COUNT函数是明智的选择。储存评论数量是一种经典的反规范化方式,但会带来很多麻烦。虽然这种方法检索效率稍高,但插入操作变得更加昂贵:每次新增评论不仅需要插入到评论表中,还需要对包含评论计数的行进行写锁定。
num_comments
列违反了第三范式,因为它引入了一个非键依赖关系 -- 一个与键无关的值,但在本例中依赖于很可能来自完全不同表格的值。至于头痛问题,问题不仅仅是编写“几个触发器”,而且还要随着数据库的演变来维护触发器以及其他所有内容。 - Ted Hopp前者没有被规范化,但会产生更好的性能(假设读操作远多于写操作)。
后者被规范化得更好,但需要更多资源,因此性能较差。
哪种更好取决于应用要求。
我同意@Oded的观点。这取决于应用程序的要求以及网站的活跃程度,但是以下也是我的建议:
COUNT
。这与数据库规范化所教授的一致。JOIN
了;您如何对半个表进行 JOIN
并获得有意义的结果呢?显然,尝试对表的所有分区进行 JOIN
并合并结果比病情更糟糕。
COUNT
。 - Jon