这是一个很好的方法来计算'评论系统中的列?

时间:2018-01-03 14:29:09

标签: mysql database join database-design count

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

我们假设有两个表格:'评论'表和'实体'表

Comments表有一个引用名为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'实体表中的列,这样我就可以在没有连接的情况下轻松获得注释计数,并在每次更改时更新它们。

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

让我知道是否有更好的解决方案。

2 个答案:

答案 0 :(得分:3)

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

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

确保INDEX(entity_id)上有comments

答案 1 :(得分:1)

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

  1. 如果Comment表中的记录数量如此之多。
  2. 如果Entities表中的选择次数太多。
  3. 最好使用comment_count列。

    但是,我不建议在comment_count中添加Entities列。 comment_count中的更改次数非常多。但是,Entities中的更改次数很少。

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

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