需要有关数据库表设计的帮助

时间:2011-04-01 11:56:44

标签: database-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天的统计数据。 请告诉我应该怎么做。

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)

第二个关于桌面设计工作的效率高于第一个,因为在第二个设计中它很容易管理不。天和用户,以及第一次设计在插入一些记录后看起来也很复杂......