不同类型游戏的起始列表的数据库设计

时间:2013-11-19 14:39:02

标签: database-design model entity-relationship normalization

我想在我的应用程序中为几个游戏设计一个架构。游戏可以是不同类型的,我想要创建的是一个很好的设计,为这些游戏提供开始列表。

游戏可以由个人或团队进行,开始列表可以是小组或决斗。开始列表类型给出了游戏类型:(我将使用与运动类比)

  • 一群人(如马拉松)
  • 个人决斗(如网球)
  • 一组球队(比如田径运动员)
  • 团队决斗(如足球)

我在考虑这样的事情:

GameEvent

  1. id
  2. idGameType
    1. group individual
    2. 决斗个人
    3. 团队
    4. 决斗队
  3. idDuel //in case game type==2 or 4
  4. 决斗

    1. id
    2. idGameEvent
    3. idPlayer1 //in case of gametype==2
    4. idPlayer2
    5. idTeam1 //in case of gametype==4
    6. idTeam2
    7. GameGroup (多对多映射)

      1. id
      2. idGameEvent
      3. idPlayer //in case of gametype==1
      4. idTeam //in case of gametype==3
      5. 这个解决方案是好的吗?还有另外一个更好吗?如果是,请解释原因。 其他解决方案(但我不确定)是基于4种类型分割表。

        更新:除了已发布的答案,我找到了另一种方法here

        Player                Participant           Team                    Participation
        ------                 -------          -------------             --------------
        participant_id(PK,FK)--->participant_id   <--- participant_id(PK,FK)  participant_id
        participant_type(FK) --->participant_type <--- participant_type(FK)   gameevent_id
        birthdate              name                    home_site              result 
        

        UPDATE2 participant_type列告诉我们参与者是个人还是团队(在应用程序级别上有助于了解这一点)。它与participant_idPlayer表中的Team一起用作约束。

2 个答案:

答案 0 :(得分:2)

我普遍同意Kombajn的建议 - 将个人保持为团队(这是一种非常好的做法,通常在干净的设计中完成,简化了很多事情)等。但是:

  1. 我认为应该在TeamGameEvent之间保留多对多关系 - 团队应该能够参与更多活动。我会称这个表为Participation。优点是您可以为每个参与添加属性(例如团队的结果)。

  2. 如果Player - Team关系,问题在于玩家是否可以成为更多团队的一部分。如果是,我们会再次建立多对多关系,并且需要额外的表格。

  3. 结果如下:

    Player       PlayerTeam        Team           Participation         GameEvent
    ------       ----------        -------        -------------         --------------
    id    <----- player_id    .--> id     <------ team_id          ,--> id
    name         team_id   --'     name           gameevent_id ---'     game_type
                 since                            result                date
                                                                        place
    

    请注意,结果也可以放入GameEvent表中,包括例如获胜团队的链接...但我相信将其放入参与表更好。它允许你更多相同的东西 - 例如存储所有参与团队的分数和订单,而不仅仅是获胜者。

    如果您不希望玩家加入更多团队,您可以简化设计,但要注意它不是很灵活:

    Player            Team           Participation         GameEvent
    ------            -------        -------------         --------------
    id           ,--> id     <------ team_id          ,--> id
    team_id ----'     name           gameevent_id ---'     game_type
    name                             result                date
                                                           place
    

答案 1 :(得分:1)

删除表决斗。将个人视为单人球队。让游戏有很多团队。该模型将简化为:

GameEvent (id [PK], game_type)
Team (id [PK], game_id [FK: GameEvent])
Player (id [PK], team_id [FK: Team])

您需要在应用程序级别(基于game_type)验证游戏中的团队数量和团队中的玩家数量。

注意这允许进一步扩展:例如,让新游戏类型有四个双人游戏团队。