【问题标题】:Database Design for one-on-one sports一对一运动的数据库设计
【发布时间】:2009-02-17 06:31:34
【问题描述】:

假设我正在开发一个应用程序来跟踪装箱结果。跟踪这些以拥有两个表的最佳方法是,如下所示:

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

...还是我错过了更好的方法来做到这一点?

如果没有存储结果,只是两个对手匹配的记录呢?

谢谢!

【问题讨论】:

    标签: database-design


    【解决方案1】:

    好吧,为了完全标准化,我会选择:

    拳击手 - 引用。

    匹配:

    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 中有两行,在 Matches 中每场比赛有一行。

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

    【讨论】:

    • 这种方法的优点是让您可以轻松查询某人参加的所有比赛,而不必查询他们是拳击手的所有比赛,以及他们所属的所有比赛对手。
    • 我知道这很古老,但我正在尝试为 UFC 比赛做类似的事情。我很好奇您将如何查询战斗机参加的所有比赛,因为他们可能不是赢家。我抓取了一堆 UFC 数据,并在战斗表中有 Fight_ID、F1_ID、F2_ID、F1_is_winner、F1_is_winner 但这对我不起作用。试图围绕正确的桌子设计来思考。
    【解决方案2】:

    winner_id 存储在同一记录中。
    这允许您显示即将到来的战斗,这与建议存储 winner_idloser_id 的解决方案不同,因为在战斗发生之前不存在赢家或输家。

    匹配

    • match_id
    • 比赛日期
    • winner_id

    比赛格斗

    • match_id
    • fighter_id

    战士

    • fighter_id
    • 战斗机名称

    【讨论】:

      【解决方案3】:

      存储获胜者 ID 会将 Matches 表中的记录数减少一半。否则存储对手ID没有意义。

      【讨论】:

        【解决方案4】:

        问题中的拳击手

        匹配:

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

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

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

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

        【讨论】:

        • 这就是我目前为 UFC 数据库设置类似表的方式,但我一直坚持如何正确查询战斗机参加过的战斗。我只有 F1_Id 和 F2_id 而不是 Winner_ID 和 Loser_ID .在查询 F1 或 F2 是某个战斗机 ID 并且还包括其名称的任何战斗时,我只得到 F1 的名称,因为它们都是 Fighter_ID 的外键。有关如何正确执行此操作的任何提示?
        猜你喜欢
        • 1970-01-01
        • 2014-11-06
        • 2015-08-05
        • 1970-01-01
        • 2018-09-29
        • 2021-11-19
        • 1970-01-01
        • 2016-12-27
        • 2011-10-16
        相关资源
        最近更新 更多