[英]Need help with database table design
我想在数据库中存储用户的最近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天统计信息。 请告诉我该怎么做。
设计1要优越得多。 如果您决定以后要记录更多的日子,则不需要编写另一组查询来获取此数据。 我想您是想在Design 1中有一个“ day”列? 为什么不使用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主键字段只是为了简化在查询/更新中使用时的行标识。
我更喜欢这样:
id 用户ID 值的 天
1 0 54 1 //Day 1 stats for Peter
2 0 50 2 //Day 2 stats for Peter
表用户
id Name
0 Peter
如果您要添加或删除更多天,则不必更改表定义。
为了提高速度,您可以通过UserId创建和编制索引
设计1更好,但尚未完成。
在设计1中,您可以执行以下查询
select user_name, avg(stats) as average from user group by user_name order by avg(stats)
在设计2中,任何涉及汇总数据,查找最小值或排序的查询充其量都是非常麻烦的。
另外,有一天您可能决定存储最近7天而不是5天的数据,而使用Design 2,则必须更改数据库定义。
我认为您应该再增加1个表,即“统计”表。
我心里有这样的想法:
tbl_users
ID用户名
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;
第二个表设计比第一个设计更有效地工作,因为在第二个设计中它很容易管理。 时间和用户,而且在插入一些记录后,第一个设计看起来也很复杂...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.