【问题标题】:How to store user statistics in the database (mysql) for different sections?如何在数据库(mysql)中存储不同部分的用户统计信息?
【发布时间】:2014-06-03 03:55:50
【问题描述】:

有统一的内容,如论坛、新闻、文章等。内容由一个主题和它的cmet组成。用户写topic和cmets,需要对每个用户进行统计。

第一个想法——创建一个常规表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,这不好。

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

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

对于第一个主题的情况,当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都会分析整个表以搜索重复项。大量使用会降低性能。

谁能提出更多的想法?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    类似于您的第三种方式,但将“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)
    

    插入和更新:

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

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多