MySQL表设计,一行或更多pr用户?

时间:2012-09-26 12:21:23

标签: mysql sql database-design

使用MySQL我有一个用户表,一个匹配表(用实际结果更新)和一个名为users_picks的表(起初它总是10个足球比赛pr.gameweek pr。联赛,因为现在只有一个联赛,但最终会有更多的联赛,其中一些只有8场比赛,比赛周。)

在users_picks表中,我应该将每个'pick'(通过选择我的意思是'hometeam得分'和'awayteam得分')存储在另一行中,还是将所有10个选择存储在一行中?两者都有用户和游戏周的FK。一行中的所有选择都意味着我的列有附加数字,如下所示:

Option 1: [pick_id, user_id, league_id, gameweek_id, match1_hometeam_score, match1_awayteam_score, match2_hometeam_score, match2_awayteam_score ... etc]

而且这个选项并没有给我带来快乐,看起来有点愚蠢。特别是因为db中会有很多潜在的NULL。第二种选择最终意味着数百万行。但看起来像这样:

Option 2: [pick_id, user_id, league_id, gameweek_id, match_id, hometeam_score, awayteam_score]

最佳做法是什么?是否可以使用第二种选择进行各种统计数据的PITA?例如。计算用户在特定回合中正确击中的匹配数,有多少正常的正确命中等等。

如果我没有多大意义,我会尝试详细说明。我只是想从一开始就把我的桌子设计做得很好,所以几个月内我不会头疼。

提前致谢。

3 个答案:

答案 0 :(得分:3)

第二种选择比第一种选择要好得多。这称为database normalisation,使查询更容易,而不是更难。我建议阅读链接的文章,以及各种“正常形式”的相关描述,并将第三范式数据结构作为最低目标。

要想看看你的第一个选项中的缺陷,想象一下以后是否会包含11场比赛的新联赛。或400。

答案 1 :(得分:1)

您应该阅读database normalization

当你有一个1:n关系时,就像你的情况一个团队有很多匹配,你会创建两个表。一个表“团队”和第二个表“匹配”,其中每一行包括参加比赛的团队的ID。

以同样的方式,您还应该为用户,选秀权和联赛提供单独的表格。

答案 2 :(得分:1)

选项二更好,只要你正确地索引你的表,因为(如你所示)它会变得非常大。 pick_id是主键,但也会在user_id字段上创建一个INDEX,因为最常见的查询可能是

SELECT * FROM `users_pics` WHERE `user_id`=?;

获取给定用户的所有选择。