我应该有一个更新计数作为用户表的一部分


Should I have an updated count as part of user table?

假设我有一个包含两个表的数据库:Users和Posts。第一个表包含每个用户的一行,第二个表包含用户写的每个帖子的一行。如果我想显示用户配置文件上的帖子计数,这两种策略中哪一种效果最好:

    每当一个用户创建一个post,我更新Users表,+1一个字段PostCount;
  1. 当有人访问配置文件时,我只需运行一个select语句来获取帖子的计数,例如select count (post_id) FROM Posts WHERE id_user = 100;

在第一种情况下,我必须经常更新表,这可能很糟糕,因为我相信表在更新时被锁定;在第二种情况下,我必须每次用户访问配置文件时运行计数。哪种毒药不那么苦?还有别的办法吗?

我想说,这取决于您显示PostCount的次数,特别是对于大量用户。如果你打算在一个会被多次调用的页面上为1000多个用户显示它,那么第一个解决方案应该是最好的。但是,您需要执行事务,以确保在添加新帖子时更新Posts和Users表。

否则,第二个解决方案就足够了,但是您应该使用LEFT OUTER JOIN,这样您就可以在一个查询中同时从Users和Posts表中获取信息。如:

SELECT * 
FROM Users u
LEFT OUTER JOIN (
    SELECT user_id , COUNT(*) AS posts_count 
    FROM Posts 
    GROUP BY user_id
) p ON p.user_id = u.id
WHERE u.id = :searched_id

(无论如何,您应该使用缓存系统,以便您不必为同一页面执行相同的SQL查询,如果显示给多个用户。)