Database design 需要数据库表设计方面的帮助吗
我想在数据库中存储用户最近5天的统计数据。我脑海中有两种db表设计 设计1:Database design 需要数据库表设计方面的帮助吗,database-design,Database Design,我想在数据库中存储用户最近5天的统计数据。我脑海中有两种db表设计 设计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
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.
id user_name day1 day2 day3 day4 day5
1 Peter 54 50 55 - -
2 Abc 10 14 - - -
设计2:
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.
id user_name day1 day2 day3 day4 day5
1 Peter 54 50 55 - -
2 Abc 10 14 - - -
以上两个哪一个更好?
因为我只需要最近5天的统计数据,所以我想在添加新日期时覆盖最早的日期统计数据,以便用户在任何时候都最多有5天的统计数据。
请告诉我应该怎么做。我更喜欢这个:
id用户id值日
1 0 54 1 //Day 1 stats for Peter
2 0 50 2 //Day 2 stats for Peter
表格用户
id Name
0 Peter
id num_tbl_users_id value
1 1 50
2 1 53
3 1 54
4 2 51
如果要添加或删除更多天数,则无需更改表定义
对于通过用户ID创建和索引的速度而言,Design 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主键字段只是为了在查询/更新中使用时简化行标识。Design 1更好,而且它并不接近 在Design 1中,可以执行如下查询
select user_name, avg(stats) as average from user group by user_name order by avg(stats)
在设计2中,任何涉及聚合数据、查找最小值或排序的查询充其量都是非常麻烦的
另外,有一天您可能会决定存储过去7天而不是5天的数据,而使用Design 2,您将不得不更改数据库定义。我认为您应该再创建一个表,“stats”表 我脑子里有这样的想法: tbl_用户
id Name
0 Peter
id num_tbl_users_id value
1 1 50
2 1 53
3 1 54
4 2 51
id用户名
1 Peter
2 Abc
tbl_统计数据
id Name
0 Peter
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;
表上第二个设计比第一个设计更有效,因为在第二个设计中,它很容易管理天数和用户,而且第一个设计在插入一些记录后看起来也很复杂…愚人节,我想?梅霍普?