3

为特定用户存储站点统计信息的最佳方式是什么?基本上我想存储用户完成特定任务的次数。数据将来自一个可能很大的表,并且会经常被引用,所以我想避免 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 中那样水平存储。

4

2 回答 2

1

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

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

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

于 2013-03-04T20:26:15.140 回答
0

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

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

表 B 已标准化且更易于维护 如果您的操作列表难以预先定义,则强烈建议使用它,如果它是动态的,则它是必须的。

从表 A 到表 B 来回传递被称为枢轴操作,您可以找到标准工具,但手动编码从来都不容易。因此,不要仅仅因为自 1970 年 Codd 以来每个人都这么说,就得出表 B 更好的结论。

我建议您问自己一个问题,即您的 COUNT(*) 表多久会被读取一次。如果你能忍受昨天的统计数据,那么每晚计算两张表。

于 2013-03-04T20:37:01.433 回答