1

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

在 users_picks 表中,我应该将每个“选择”(我的选择是指“主队得分”和“客队得分”)存储在不同的行中,还是将所有 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]

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

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

最佳做法是什么?使用第二种方法进行各种统计会是一个 PITA 吗?例如。计算用户在特定回合中正确命中了多少匹配,有多少始终正确命中等。

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

提前致谢。

4

3 回答 3

3

第二个选择比第一个好很多。这称为数据库规范化,使查询更容易,而不是更难。我建议阅读链接的文章,以及各种“范式”的相关描述,并至少以第 3 范式数据结构为目标。

要查看您的第一个选项中的缺陷,想象一下如果以后要加入一个有 11 场比赛的新联赛。或 400。

于 2012-09-26T12:22:50.177 回答
1

您应该阅读有关数据库规范化的信息。

当您有 1:n 关系时,例如在您的情况下,一个团队有很多比赛,您将创建两个表。一个表“teams”和第二个表“matches”,其中每一行都包含参加比赛的球队的 ID。

以同样的方式,您还应该为用户、选择和联赛设置单独的表格。

于 2012-09-26T12:25:06.957 回答
1

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

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

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

于 2012-09-26T12:26:37.083 回答