繁体   English   中英

在数据库表设计方面需要帮助

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM