如何针对指定postId递增post表的commentsNumber字段?求最优方案
解决方案
一、可以实现指定postId的评论关联递增post表的commentsNumber字段
如果已经添加了commentsNumber字段,你可以在新增/删除评论时联动更新对应帖子的评论数字段:
1. 新增评论时递增字段
假设要给postId = 123的帖子新增评论,同步递增其commentsNumber:
-- 先插入评论(示例) INSERT INTO comments (postId, content, createTime) VALUES (123, '新评论内容', NOW()); -- 再递增对应帖子的评论数 UPDATE post SET commentsNumber = commentsNumber + 1 WHERE id = 123;
2. 更新后获取最新评论数
如果用PostgreSQL这类支持RETURNING子句的数据库,可直接返回更新后的值:
UPDATE post SET commentsNumber = commentsNumber + 1 WHERE id = 123 RETURNING commentsNumber;
如果是MySQL这类不支持RETURNING的数据库,更新后单独查询即可:
SELECT commentsNumber FROM post WHERE id = 123;
注意:用这种方案必须保证所有修改评论的操作(删除、批量删除)都同步更新commentsNumber,否则会出现数据不一致。
二、无冗余字段的更优方案(推荐)
既然commentsNumber字段原本不存在,更推荐不存储这个冗余字段,通过实时查询统计评论数,从根源避免数据不一致问题,也无需维护额外字段:
1. 查询单篇帖子的评论数
用子查询直接统计对应帖子的评论量:
SELECT p.*, (SELECT COUNT(*) FROM comments c WHERE c.postId = p.id) AS commentsNumber FROM post p WHERE p.id = 123;
2. 查询多篇帖子时附带评论数
用LEFT JOIN结合GROUP BY实现,减少重复计算:
SELECT p.*, COUNT(c.id) AS commentsNumber FROM post p LEFT JOIN comments c ON p.id = c.postId GROUP BY p.id ORDER BY p.createTime DESC;
优缺点对比:
- 实时统计:数据100%准确,无需维护字段,适合中小流量场景;若帖子和评论量极大,给
comments.postId建立索引即可提升统计速度。 - 冗余字段:统计速度略快,但需维护所有评论操作的同步更新,易出现数据偏差,仅适合超大规模且对查询性能要求极高的场景。
内容的提问来源于stack exchange,提问作者s4lvious
相关产品推荐
相关产品推荐

