我想创建一个数据库来存储(欧洲)足球的比赛表。 我最初想要的是一个包含
competition_id
列的所有比赛的单一表格。
如果我想获得比赛的桌子,我会根据比赛 ID 进行选择(例如where competition_id=1
)。
我现在要做一个决定。因为其中一项比赛采用小组赛然后淘汰赛的方式,这不适用于一般的万能球桌。
即使我要添加另一列“组”并在适用的地方使用它,这似乎是一个坏主意。 另外,没有办法在这张桌子上添加淘汰赛。
我正在考虑为每项比赛制作一个单独的表格,从而能够嵌入每种类型比赛的特殊性。面向未来也是我会关注的。
你有什么建议吗?
您应该创建一个general_competitions 表,其中包含有关每个比赛的相同数据类型,以及每个比赛类型的第二个表。对于查询,请使用 JOIN。
无论更高的结构如何,我都希望有一个单一的游戏/比赛表:
game_id, home_team_id, away_team_id, home_score, away_score, etc...
这可能还有比赛地点和时间等信息。
我认为这是一个细粒度的单元,将有助于团队分析和统计报告,而无需合并不同的表格。
然后游戏将与比赛挂钩:
competition_id, game_id
在该链接中,您可以添加小组信息,或者可以将小组视为子竞赛
对于淘汰赛(在上一轮比赛完成之前下一场比赛的参与者是未知的),您可能有一个链接到比赛的二叉树结构。 这样的结构可能有占位符游戏,或者在安排之前不会链接到游戏,我可以看到几种剥皮的方法,具体取决于您的分析要求。
我想这就是我的方法:
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
...
现在您可以存储所需的所有主要信息。
您可以使用结果表的 group_id 来指定是分组阶段还是淘汰阶段。
如果队伍已被淘汰,您可以将淘汰设置为1。
通过这种结构,您可以提出选择语句来为您生成排名。 您可以使用 date_played 范围来选择特定季节(年份)。因此从技术上讲,您每年都可以使用相同的结构,只需不断添加团队和新游戏即可。搜索日期范围以获取特定年份/季节的数据。
还可以添加很多其他信息,例如存储不同统计数据的表格,但这一切都取决于您的想象力。
我认为关键在于观察到有几种不同的“基本竞争形式”,而你所谓的“竞争”实际上可能由几个阶段组成,每个阶段都是一个单独的“竞争形式”。
竞争的“形式”本质上是直接淘汰赛和所有人对抗所有人。 两者都具有“主客场比赛”(想想足球)和“一场比赛”(想想网球锦标赛)的风格。
像欧洲冠军联赛这样的比赛由三个阶段组成:直接淘汰赛阶段,第二阶段有八场不同的“所有人对抗所有人”的比赛,最后阶段也是直接淘汰赛。