php - 如何将不同部分的用户统计信息存储在数据库(mysql)中?

标签 php mysql sql

有一个统一的内容,比如论坛、新闻、文章等。内容由一个主题和它的评论组成。用户写话题和评论,需要统计每个用户。

第一个想法 - 创建一个常规表 users_stat,其中包含字段 user_id、forum_thread_count、forum_message_count、news_thread_count、news_message_count 等。当论坛或评论中出现新话题时

    UPDATE users_stat 
    SET forum_thread_count = forum_thread_count + 1 
    WHERE user_id = current_user_id. 

但是问题是可以添加新的section,然后我们需要做alter table with statistics,这样不好。

也有这个想法。创建一个包含字段 user_id、content (varchar 50)、counter 的表 users_stat。当论坛或评论中出现新话题时

    UPDATE users_stat 
    SET counter = counter + 1 
    WHERE user_id = current_user_id 
    AND content = 'forum_thread'. 

对于第一个topic的情况,当poster的users_stat表中没有记录时,对user_id和content字段做主索引,然后保存统计变为

    INSERT INTO users_stat (user_id, content, counter) 
    VALUES (current_user_id, 'forum_thread', 1 ) 
    ON DUPLICATE KEY UPDATE counter = VALUES (counter + 1). 

但事实证明,“插入”只工作一次,然后,每次保存时,mysql 都会分析整个表以搜索重复项。大量使用会降低性能。

谁能提出更多想法?

最佳答案

与您的第 3 种方式类似,但“content”替换为“content_id”,这是一个引用内容表的小整数字段。并制作 (user_id, content_id) 的复合主键 [为了更好的性能,制作一个自动递增 id 和一个唯一的 (user_id, content_id)] 即

contents(id, name): data example: (1, "Forum Thread")
user_stat(user_id int, content_id int, counter int): data example: (3, 1, 5)

插入和更新:

插入 user_stat(user_id, content_id, counter) VALUES ($current_user_id, 1, 1 ) ON DUPLICATE KEY UPDATE counter = VALUES (counter + 1)

关于php - 如何将不同部分的用户统计信息存储在数据库(mysql)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24006863/

相关文章:

子类方法的 PHP 命名空间范围?

php - MySQL中有没有办法根据CASE动态定义运算符?

php - 使用阈值查找相似的十六进制颜色

MySQL 使用聚合函数进行选择

python - Python中如何检查和执行SQL语句

php - 重定向到新页面后 Laravel Auth session 丢失

php - mysqli使用mysql变量错误

mysql - 计算 MySQL 中每一行的 Z-Score? (简单的)

sql - Impala select * 不显示表的所有详细信息

python - 在 mySQL 与 postgreSQL 的执行语句(python)中使用 %s 命令?