在表中存储用户的统计信息。我应该使用这两种方法中的哪一种?

时间:2013-03-04 19:59:38

标签: php mysql

为特定用户存储网站统计信息的最佳方法是什么?基本上我想存储用户完成特定任务的次数。数据将来自一个可能很大的表,并且会经常引用,所以我想避免使用COUNT()并将它们存储在自己的表中。

方法A

有一个包含以下字段的表,然后每个用户都有一行来存储每个字段的计数:

User_id | posted_comments | comment_replies | post_upvotes | post_downvotes
50        12                7                 23             54

方法B

有一个存储操作的表,另一个存储该操作的计数:

表1:

Id | Action
1  | posted_comments
2  | comment_replies
3  | post_upvotes
4  | post_downvotes

表2

User_id | Action | Count
50      | 1      | 12
50      | 2      | 7
50      | 3      | 23
50      | 4      | 54

我看不到总共有超过25-30个动作,但我不确定这个动作是否太多,无法像方法A那样水平存储。

2 个答案:

答案 0 :(得分:1)

我想你回答了你的问题。如果您不知道操作是什么,则将每个操作存储在单独的行中。那将是第二种选择。

确保表格上有正确的索引。一种可能性是(user_id, action, count)。使用此索引,可以快速在用户级别对表进行非规范化。

如果您有明确定义的问题,并且不需要在表中添加/删除/重命名列,那么第一个版本也是可行的。否则,只需坚持插入行。查询可能看起来有点复杂,但应用程序更灵活。

答案 1 :(得分:0)

对我来说,这似乎是一个典型的BI问题。真正的问题不是你的维度中有多少“行动”,而是它们改变的频率。

表A是非规范化的,快速且易于阅读:使用“SELECT”,您可以获得正确格式的信息。

表B规范化且易于维护如果您的行动列表难以提前定义,强烈建议必须,如果它是动态的。

从表A来回传递到表B称为数据透视操作,您可以找到标准工具,但这些工具从不容易手动编码。因此,不要过于迅速地得出结论表B表示更好,因为自从1970年Codd以来每个人都这样说。

我建议您自问一个问题,即您的COUNT(*)表格读取的频率是多少。如果您能接受昨天的统计数据,那么每晚计算两张桌子。