我想在数据库中为用户存储最近5天的统计信息。我脑子里有两种类型的数据库表设计。
设计1:
id user_name stats
1 Peter 54 //Day 1 stats for Peter
2 Peter 50 //Day 2 stats for Peter
3 Abc 10 //Day 1 stats for Abc
4 Peter 55 //Day 3 stats for Peter
5 Abc 14 //Day 2 stats for Abc.
设计2:
id user_name day1 day2 day3 day4 day5
1 Peter 54 50 55 - -
2 Abc 10 14 - - -
以上哪两种更好? 由于我想要仅过去5天的统计数据,这就是为什么我要在添加新日期时覆盖最早的统计数据,以便在任何时候用户最多有5天的统计数据。 请告诉我应该怎么做。
答案 0 :(得分:2)
设计1远胜一筹。如果您决定将来记录更多天,则不希望必须编写另一组查询来获取此数据。我认为你打算在设计1中有一个“日期”栏目?为什么没有DateTime字段来指示这样的日子:
id user_name day stats
1 Peter 31-Mar-2011 54
2 Peter 01-Apr-2011 24
3 Abc 01-Apr-2011 23
然后您可以在方便的时候清除数据。 id主键字段仅用于在查询/更新中使用时简化行标识。
答案 1 :(得分:0)
我更喜欢这个:
ID UserID 值 天
1 0 54 1 //Day 1 stats for Peter
2 0 50 2 //Day 2 stats for Peter
表用户
id Name
0 Peter
如果您想要添加或删除更多天,则无需更改表定义。
对于速度,您可以通过UserId
创建和索引答案 2 :(得分:0)
设计1更好,而且不是很接近。
在设计1中,您可以执行类似
的查询select user_name, avg(stats) as average from user group by user_name order by avg(stats)
在设计2中,任何涉及聚合数据,找到最小值或排序的查询都会非常麻烦。
另外,有一天您可能决定存储过去7天而不是5天的数据,而使用设计2,您将不得不更改数据库定义。
答案 3 :(得分:0)
我认为你应该再制作1个表,“统计数据”表。
我心中有类似的东西:
<强> tbl_users 强>
id user_name
1 Peter
2 Abc
<强> tbl_stats 强>
id num_tbl_users_id value
1 1 50
2 1 53
3 1 54
4 2 51
然后只调整您的SQL查询以仅检索最后5条记录。
SELECT tbl_users.user_name, tbl_stats.value
FROM tbl_users
INNER JOIN tbl_stats ON tbl_users.id = tbl_stats.num_tbl_users_id
WHERE tbl_users.id = 1
ORDER BY tbl_stats.id DESC LIMIT 5;
答案 4 :(得分:-1)