一对一体育数据库设计

时间:2009-02-16 22:05:39

标签: database-design

假设我正在开发一个跟踪拳击结果的应用程序。跟踪这些是最好的方法有两个表,如:

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

......或者我错过了更好的方法吗?

如果没有存储结果,只是两个对手匹配的录音怎么办?

谢谢!

4 个答案:

答案 0 :(得分:4)

嗯,对于一个完全正常化的人,我会选择:

拳击手 - 如引用的那样。

匹配

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

Opponents中有两行,每场匹配中有一行匹配。

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

答案 1 :(得分:2)

winner_id存储在同一记录中 这使您可以显示即将发生的战斗,而不像建议存储winner_idloser_id的解决方案,因为在战斗发生之前不会存在赢家或输家。

匹配

  • match_id
  • match_date
  • winner_id

匹配战士

  • match_id
  • fighter_id

战斗机

  • fighter_id
  • fighter_name

答案 2 :(得分:0)

存储获胜者ID会将“匹配”表中的记录数量减半。否则,存储对手ID是没有意义的。

答案 3 :(得分:0)

问题中的拳击手

与以下内容匹配:

match_id int pk
winner_id int fk
loser_id int fk
result(_id) int/bool nullable
date
...

如果结果只能是“win”或“unknown”,则可以为空的布尔值就足够了。

如果有不同的结果类型(例如导致相扑中赢/输的技术名称),请使用可为空的int。

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