在我的系统中,有实体(帖子)和评论。
我们假设有两个表格:'评论'表和'实体'表
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'实体表中的列,这样我就可以在没有连接的情况下轻松获得注释计数,并在每次更改时更新它们。
我想知道这样做是否正确(或有效)。
让我知道是否有更好的解决方案。
答案 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
列。使用计数列与您的项目条件相关:
Comment
表中的记录数量如此之多。 Entities
表中的选择次数太多。最好使用comment_count
列。
但是,我不建议在comment_count
中添加Entities
列。 comment_count
中的更改次数非常多。但是,Entities
中的更改次数很少。
在这种情况下,将更多可变列移动到另一个表更好。我们将其命名为:Entities_Statistics
并以Entities_ID
为F.K.您可以将所有统计信息放入其中(例如评论数量,观看次数等)。
因此,您可以从这个新表中获取统计信息,而不使用count(*)
等聚合函数。