在评论系统中制作“计数”列是一种好方法吗?

问题描述 投票:2回答:2

在我的系统中,有实体(帖子)和评论。

假设有两个表:'comments'表和'entities'表

注释表有一个引用名为entity_id的实体的外键

有一件事我担心,也就是说,我经常需要与实体一起获得评论,我使用LEFT JOIN来获取评论数。

SELECT entities.*, comment_count FROM entities LEFT JOIN 
  (SELECT entity_id,count(id) AS comment_count FROM comments GROUP BY entity_id)  
   AS entity_comment ON entity_comment.entity_id = entities.id

但每次使用LEFT JOIN和COUNT感觉有点像浪费服务器资源和代码量,

所以我试图在实体表中添加一个'comment_count'列,这样我就可以轻松获得注释计数而无需连接,每次更改时都会更新它们。

我想知道这样做是否正确(或有效)。

如果有更好的解决方案,请告诉我。

mysql database join database-design count
2个回答
1
投票

我想从数据库设计角度解释有关comment_count列。使用计数列与您的项目条件相关:

  1. 如果Comment表中的记录数量如此之多。
  2. 如果Entities表中的选择数量如此之多。

最好使用comment_count色谱柱。

但是,我不建议在comment_count中使用Entities色谱柱。 comment_count的变化数量如此之多。但是,Entities的变化数量很少。

在这种情况下,最好将更多可更改的列移动到另一个表。让它命名为:Entities_Statistics并有一个Entities_ID作为F.K.您可以将所有统计信息(例如评论数量,观看次数等)放入其中。

因此,您可以从这个新表中获取统计信息,而不使用像count(*)这样的聚合函数。


3
投票

这是一个混乱的情况。 LEFT是必需的,因为可能没有评论。但LEFT可能不会很好地优化。试试这个:

SELECT  e.*, 
        ( SELECT  COUNT(*)
            FROM  comments
            WHERE  entity_id = e.id 
        ) AS comment_count
    FROM  entities e 

并确保在INDEX(entity_id)上有comments

© www.soinside.com 2019 - 2024. All rights reserved.