Database design 一对一运动数据库设计

Database design 一对一运动数据库设计,database-design,Database Design,假设我正在开发一个跟踪拳击比赛结果的应用程序。最好的跟踪方法是使用两个表,如下所示: Boxers ====== id name Matches ======= id match_number boxer_id opponent_id result 。。。然后每场比赛有两张记录,一张是赢家的,一张是输家的,类似这样: id match_number boxer_id opponent_id result -- ------------ -------- ----------- ------

假设我正在开发一个跟踪拳击比赛结果的应用程序。最好的跟踪方法是使用两个表,如下所示:

Boxers
======
id
name

Matches
=======
id
match_number
boxer_id
opponent_id
result
。。。然后每场比赛有两张记录,一张是赢家的,一张是输家的,类似这样:

id match_number boxer_id opponent_id result
-- ------------ -------- ----------- ------
1  1            1001     2001        WIN
2  1            2001     1001        LOSS
。。。还是我错过了更好的方法

如果存储的不是结果,而是两个对手配对的记录,该怎么办


谢谢

获胜者id
存储在同一记录中。
这允许您显示即将到来的战斗,而解决方案建议只在战斗发生之前不存在赢家或输家时才存储
赢家\u id
输家\u id

比赛
  • 匹配id
  • 匹配日期
  • 优胜者身份证
斗士
  • 匹配id
  • 战斗机识别码
战士
  • 战斗机识别码
  • 战斗机名称

获胜者id
存储在同一记录中。
这允许您显示即将到来的战斗,而解决方案建议只在战斗发生之前不存在赢家或输家时才存储
赢家\u id
输家\u id

比赛
  • 匹配id
  • 匹配日期
  • 优胜者身份证
斗士
  • 匹配id
  • 战斗机识别码
战士
  • 战斗机识别码
  • 战斗机名称

好吧,对于一个完全标准化的,我会选择:

拳击手-引用

匹配项:

id  / match_number   (Don't think these need to be distinct anymore)
winner (FK-Boxers; Nullable, for for matches scheduled, but not decided yet)
反对者:

id  (meaningless PK value.  Optional. 
     you could use the other two fields as the PK)
match_id
boxer_id
对手两排,每场比赛一排


(更新后添加了其他答案的建议)

好吧,为了完全规范化,我选择:

拳击手-引用

匹配项:

id  / match_number   (Don't think these need to be distinct anymore)
winner (FK-Boxers; Nullable, for for matches scheduled, but not decided yet)
反对者:

id  (meaningless PK value.  Optional. 
     you could use the other two fields as the PK)
match_id
boxer_id
对手两排,每场比赛一排


(更新以添加其他答案的建议)

存储获胜者ID将使比赛表中的记录数减少一半。否则,存储对手ID是没有意义的。

存储赢家ID会将比赛表中的记录数减少一半。否则,存储对手ID是没有意义的。

问题中提到的拳击手

符合:

match_id int pk
winner_id int fk
loser_id int fk
result(_id) int/bool nullable
date
...
如果结果只能是“win”或“unknown”,则一个可为空的布尔值就足够了

如果有不同的结果类型(例如,在相扑比赛中导致胜负的技术名称),请使用可为空的int


当您存储数据时,您应该始终问自己:我的数据应该能够回答什么样的问题。

问题中的拳击手

符合:

match_id int pk
winner_id int fk
loser_id int fk
result(_id) int/bool nullable
date
...
如果结果只能是“win”或“unknown”,则一个可为空的布尔值就足够了

如果有不同的结果类型(例如,在相扑比赛中导致胜负的技术名称),请使用可为空的int


当您存储数据时,您应该始终问自己:我的数据应该能够回答什么样的问题。

这种方法的优点是允许您轻松查询某人参加的所有比赛,而不必查询他们是拳击手的所有比赛,所有的比赛他们都是对手。我意识到这很古老,但我正试图在UFC比赛中做类似的事情。我很好奇,你会如何质疑一个拳击手参加的所有比赛,因为他们可能不是赢家。我抓取了一堆UFC数据,在战斗表中有战斗ID,F1 ID,F2 ID,F1 U是冠军,F1 U是冠军,但这对我不起作用。试着将我的头脑集中在正确的表格设计上。这种方法的优点是允许您轻松查询某人参加的所有比赛,而不必查询他们是拳击手的所有比赛,以及他们是对手的所有比赛。我意识到这很古老,但我正在尝试为UFC比赛做类似的事情。我很好奇,你会如何质疑一个拳击手参加的所有比赛,因为他们可能不是赢家。我抓取了一堆UFC数据,在战斗表中有战斗ID,F1 ID,F2 ID,F1 U是冠军,F1 U是冠军,但这对我不起作用。我正在尝试正确的表格设计。这就是我目前如何为UFC数据库设置类似的表格,但我一直在思考如何正确地查询出一架战斗机参加过哪些战斗。我没有赢家ID和输家ID,只有F1 ID,F2\u id。当查询出F1或F2是某个战斗机id且包含其名称的任何战斗时,我只会得到F1的名称,因为它们都是战斗机id的外键。关于如何正确执行此操作,有什么提示吗?这是我目前为UFC数据库设置的类似表格,但我一直无法正确地查询出什么一个拳击手参加过的比赛。我没有赢家ID和输家ID,我只有F1 ID,F2 ID。当查询出任何F1或F2是某个战斗机ID并且包括其名称的战斗时,我只会得到F1的名称,因为它们都是战斗机ID的外键。关于如何正确执行此操作,有什么提示吗?