Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 不同类型游戏的startlist数据库设计_Database Design_Model_Entity Relationship_Normalization - Fatal编程技术网

Database design 不同类型游戏的startlist数据库设计

Database design 不同类型游戏的startlist数据库设计,database-design,model,entity-relationship,normalization,Database Design,Model,Entity Relationship,Normalization,我想为我的应用程序中的几个游戏设计一个模式。游戏可以是不同类型的,我想创建的是一个好的设计,为这些游戏提供开始列表 游戏可以由个人或团队进行,开始名单可以是小组或决斗。开始列表类型给出了游戏类型:(我将使用与运动的类比) 个人团体(如马拉松) 个人决斗(如网球) 一组队伍(就像田径运动中的接力赛) 团队决斗(如足球) 我在想这样的事情: Player PlayerTeam Team Participation GameEvent

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

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

  • 个人团体(如马拉松)
  • 个人决斗(如网球)
  • 一组队伍(就像田径运动中的接力赛)
  • 团队决斗(如足球)
我在想这样的事情:

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

  • id
  • idGameType
  • 群体个体
  • 决斗个人
  • 小组
  • 决斗队
  • idDuel//如果游戏类型==2或4
  • 决斗

  • id
  • idGameEvent
  • idPlayer1//如果游戏类型==2
  • idPlayer2
  • idTeam1//如果游戏类型==4
  • idTeam2
  • 游戏组(多对多映射)

  • id
  • idGameEvent
  • idPlayer//如果游戏类型==1
  • idTeam//如果游戏类型==3
  • 这个解决方案好吗?还有更好的吗?如果是,请解释原因。 另一个解决方案(但在我不确定的情况下)是根据4种类型划分表

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

    玩家参与者团队参与
    ------                 -------          -------------             --------------
    
    参与者id(PK,FK)--->参与者id参与者类型移除桌面决斗。将个人视为一体的团队。让游戏有很多队。该模型将简化为:

    GameEvent (id [PK], game_type)
    Team (id [PK], game_id [FK: GameEvent])
    Player (id [PK], team_id [FK: Team])
    
    您需要在应用程序级别(基于游戏类型)验证游戏中的团队数量和团队中的玩家数量


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

    我通常同意Kombajn的建议-保持个人作为团队(这是一个非常好的实践,通常在干净的设计中完成,简化了很多事情)等等。。然而:

  • 我认为,
    Team
    GameEvent
    之间应该保持多对多的关系——团队应该能够参与更多的活动。我将此表称为参与
  • 。优点是您可以为每个参与添加属性(例如,团队的结果)

  • 玩家
    -
    团队
    关系的情况下,问题是该玩家是否可以加入更多的团队。如果是,我们又有了多对多关系,需要额外的表

  • 结果如下所示:

    Player       PlayerTeam        Team           Participation         GameEvent
    ------       ----------        -------        -------------         --------------
    id    <----- player_id    .--> id     <------ team_id          ,--> id
    name         team_id   --'     name           gameevent_id ---'     game_type
                 since                            result                date
                                                                        place
    
    玩家团队参与游戏事件
    ------       ----------        -------        -------------         --------------
    身份证
    名称团队\u id--“名称游戏事件\u id--”游戏类型
    自结果日期起
    地方
    
    请注意,结果也可以放在GameEvent表中,包括例如指向获胜团队的链接。。。但我相信把它放在参和表中会更好。它允许您使用相同的功能和其他功能—例如,为所有参与团队存储分数和订单,而不仅仅是获胜团队

    如果你不想让玩家加入更多的团队,你可以简化设计,但要知道这不是很灵活:

    Player            Team           Participation         GameEvent
    ------            -------        -------------         --------------
    id           ,--> id     <------ team_id          ,--> id
    team_id ----'     name           gameevent_id ---'     game_type
    name                             result                date
                                                           place
    
    玩家团队参与游戏事件
    ------            -------        -------------         --------------
    id,-->id
    团队标识--“名称游戏事件标识--”游戏类型
    名称结果日期
    地方
    
    你需要问我们一个特定的问题。@rbaryyoung我编辑了这篇文章并添加了问题。你可能是说参与者id而不是参与者id,类型相同?你能描述一下每个表的主键吗?描述一下“type”列是什么意思吗?@Tomas我更新了帖子。啊,现在我明白你的意思了。你是说类继承模式,参与者是团队和玩家的泛化。。。但1)您的案例不是泛化模式,而是层次模式。现在你失去了球员-球队的等级,也就是说,你现在不再知道哪些球员属于哪个球队。2) 这种设计要复杂得多(表的数量、查询的复杂性),与其他设计相比没有附加值。你可以用一张或两张桌子来实现更多。结论:我不赞成。我喜欢你的方法有多简单。我会考虑的,但我想问你是否能找到另一个。这种解决方案的缺点是将个人视为一人团队,这只是数据模型层。您的应用程序不必向最终用户呈现单人团队,它可以根据玩家数量或游戏类型采取不同的行动。或者,您可以在团队表(个人Y/N)或“球员人数”字段中添加一个标志,以简化此检查。什么最适合你。谢谢你详细的回答。很可能我会这样做。团队成员设计的另一种方法是使用另一个名为
    Participant
    的表,其中
    Participant\u id
    Participant\u type
    作为列。加上两个表
    Player(参与者id,参与者类型)
    Team(参与者id,参与者类型)
    。普拉