【问题标题】:Is it a good approach to make a 'count' column in a comment system?在评论系统中创建“计数”列是一种好方法吗?
【发布时间】:2018-06-13 05:51:53
【问题描述】:

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

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

Comments 表有一个外键,它引用名为 entity_id 的实体

我担心的一件事是,我经常需要获取 cmets 和实体的计数,并且我正在使用 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


【解决方案1】:

这是一个混乱的局面。 LEFT 是必需的,因为可能有零个 cmets。但是LEFT 可能优化不好。试试这个吧:

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

并确保在comments 上有INDEX(entity_id)

【讨论】:

【解决方案2】:

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

  1. 如果Comment表中的记录数这么多。
  2. 如果Entities表中的选择次数太多了。

最好使用comment_count 列。

但是,我不建议在Entities 中有comment_count 列。 comment_count 的修改次数实在是太多了。但是,Entities 的更改次数很少。

在这种情况下,最好将更多可变列移动到另一个表中。将其命名为:Entities_Statistics 并有一个 Entities_ID 作为 F.K.您可以将所有统计信息都放入其中(如 cmets 数、查看次数等)。

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

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 2011-08-06
    • 2014-12-21
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2019-02-23
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多