数据库架构建议

时间:2011-08-25 19:29:25

标签: mysql database-design

我想创建一个数据库来存储(欧洲)足球比赛表。 我最初想要的是一张包含competition_id列的所有比赛的单人桌。 如果我想参加比赛,我会根据比赛ID(例如where competition_id=1)进行选择。

我现在有决定。因为其中一个比赛使用了小组然后淘汰游戏,这不适用于一般的通用表。

即使我要添加另一列“组”并且它适用的地方也使用它,这似乎是一个坏主意。 另外,没有办法在这张桌子上添加淘汰赛。

我正在考虑为每场比赛单独制作一张桌子,从而能够嵌入每种比赛的特殊性。未来的证明也是我要看的东西。

你有什么建议吗?

4 个答案:

答案 0 :(得分:1)

您应该制作一个general_competitions表,其中包含每个竞赛的相同数据类型,以及每个竞赛类型的第二个表。对于查询,请使用JOIN。

答案 1 :(得分:1)

无论结构越高,我都希望有一个游戏/匹配表:

game_id, home_team_id, away_team_id, home_score, away_score, etc...

这可能还有关于比赛场地和时间的信息等。

我认为这是一个细化的单元,可以促进团队分析和统计报告,而无需将不同的表联合起来。

然后游戏将与比赛联系起来:

competition_id, game_id

在该链接中,您可以添加群组信息,或者可以将群组视为子竞赛

对于淘汰赛(下一场比赛的参赛者在上一轮比赛完成前未知),你可能会有一个与游戏相关的二叉树结构。这样的结构可能会有占位游戏,也可能没有链接到游戏,直到他们被安排,我可以看到一些方法来剥离那只猫,这取决于你的分析要求。

答案 2 :(得分:0)

我想这可能是我的方法:

table Competitions
competition_id PK
competition_name
...

table Teams
team_id PK
team_name
...

table Results
result_id PK
competition_id FK
home_team_id FK
away_team_id FK
group_id
eliminatied 
date_played
...

现在您可以存储所需的所有主要信息 您可以使用Results表的group_id来指定它是组还是淘汰阶段。 如果团队已被淘汰,您可以将淘汰赛设置为1。

通过这种结构,您可以提出选择语句来为您生成排名。 您可以使用date_played范围来选择特定季节(年)。所以从技术上讲,你每年都可以使用相同的结构,只需继续添加团队和新游戏。搜索日期范围以获取特定年份/季节的数据。

可以添加很多其他信息,例如用于存储不同统计信息的表格,但所有这些都取决于您的想象力。

答案 3 :(得分:0)

Hmmmmmmmmmm。

我认为关键在于观察到有几种不同的“基本竞争形式”,而你所谓的“竞争”实际上可能由几个阶段组成,每个阶段都是一个单独的“竞争形式”。 / p>

竞争“形式”本质上是直接淘汰,每个人都反对每个人。他们俩都有“主场和客场比赛”(想想足球)和“单场比赛”(想想网球锦标赛)的风格。

像欧洲冠军联赛这样的比赛分为三个阶段:直接淘汰赛阶段,第二阶段有8个不同的“每个人都参加比赛”比赛,最后阶段再次直接淘汰赛