假设我正在开发一个跟踪拳击结果的应用程序。跟踪这些是最好的方法有两个表,如:
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
......或者我错过了更好的方法吗?
如果没有存储结果,只是两个对手匹配的录音怎么办?
谢谢!
答案 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_id
和loser_id
的解决方案,因为在战斗发生之前不会存在赢家或输家。
答案 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。
当您存储数据时,您应该总是问自己:我的数据应该能够回答什么样的问题。