2012-09-26 18 views
1

使用MySQL我有用户的表格,一张表格(匹配表格更新实际结果)和一张名为users_picks的表格(起初它总是会有10个足球比赛的比赛周联盟,因为只有一个联赛截至目前,但最终还是会有更多的联赛,其中一些只有8场比赛的比赛周)。MySQL表格设计,一行或更多公关用户?

在users_picks表中,我是否应该在不同的行中存储每个'pick'(通过挑选我的意思是'hometeam score'和'awayteam score'),或者在一个单行中存储所有10个picks?无论是用户还是周日的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

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

要想看到你的第一个选择的缺陷,想象一下如果在11场比赛之后有新的联赛加入。或400.

1

您应该阅读约database normalization

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

以同样的方式,你也应该有用户,选秀和联赛的单独表格。

1

选项二更好,只要您正确指定您的表格,因为(如您所示)它会变得相当大。该pick_id是主键,但也创造了对user_id的一个索引,因为可能是最常用的查询将是

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

获得给定用户所有的选秀权。