Database design 需要数据库表设计方面的帮助吗

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

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

表上第二个设计比第一个设计更有效,因为在第二个设计中,它很容易管理天数和用户,而且第一个设计在插入一些记录后看起来也很复杂…

愚人节,我想?梅霍普?