为特定用户存储网站统计信息的最佳方法是什么?基本上我想存储用户完成特定任务的次数。数据将来自一个可能很大的表,并且会经常引用,所以我想避免使用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那样水平存储。
答案 0 :(得分:1)
我想你回答了你的问题。如果您不知道操作是什么,则将每个操作存储在单独的行中。那将是第二种选择。
确保表格上有正确的索引。一种可能性是(user_id, action, count)
。使用此索引,可以快速在用户级别对表进行非规范化。
如果您有明确定义的问题,并且不需要在表中添加/删除/重命名列,那么第一个版本也是可行的。否则,只需坚持插入行。查询可能看起来有点复杂,但应用程序更灵活。
答案 1 :(得分:0)
对我来说,这似乎是一个典型的BI问题。真正的问题不是你的维度中有多少“行动”,而是它们改变的频率。
表A是非规范化的,快速且易于阅读:使用“SELECT”,您可以获得正确格式的信息。
表B规范化且易于维护如果您的行动列表难以提前定义,强烈建议必须,如果它是动态的。
从表A来回传递到表B称为数据透视操作,您可以找到标准工具,但这些工具从不容易手动编码。因此,不要过于迅速地得出结论表B表示更好,因为自从1970年Codd以来每个人都这样说。
我建议您自问一个问题,即您的COUNT(*)表格读取的频率是多少。如果您能接受昨天的统计数据,那么每晚计算两张桌子。