2011-04-01 79 views
0

我想为数据库中的用户存储最近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   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  -  -  - 

使上述2个比较好? 因为我只想要的统计数据,所以只有最近5天,这就是为什么我想在添加新的一天时覆盖最早的日期统计数据,以便在任何时候有最多5天的统计数据。 请告诉我应该怎么做。

回答

2

设计1是远远优于。如果您决定要在未来录制更多天,则不需要编写另一组查询来获取此数据。我认为你打算在设计1中有一个“日”栏?为什么没有一个日期时间字段,用于指示一天像这样:

id user_name  day   stats 
1  Peter   31-Mar-2011 54 
2  Peter   01-Apr-2011 24 
3  Abc   01-Apr-2011 23 

然后你就可以在自己方便的清除数据。 id主键字段仅用于简化在查询/更新中使用的行标识。

0

我喜欢这个更多:

ID用户名

1  0  54  1  //Day 1 stats for Peter 
2  0  50  2  //Day 2 stats for Peter 

表用户

id Name 
0 Peter 

如果您想添加或删除更多天,您不必更改表格定义。

对于速度,你可以创建和指数用户ID

0

设计1更好,但它并不接近。

在设计1,你可以查询,如

select user_name, avg(stats) as average from user group by user_name order by avg(stats) 

在设计2,涉及汇总数据,寻找最小或排序将是非常麻烦的最好的任何查询。

另外,有一天您可能会决定存储过去7天而不是5天的数据,而在Design 2中,您必须更改数据库定义。

0

我认为你应该只是制作更多的表格“stats”表格。

我有类似的东西在我的脑海:

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; 
-1

第二张桌子上的设计工作效率高于第一张,因为第二张设计很容易管理。天和用户,也首先设计也看起来像复杂后插入一些记录...

+0

四月愚人,methinks? Mehopes? – 2011-04-01 12:19:06

+0

今天很享受.......... – ravi 2011-04-01 12:27:53