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
玩家参与者团队参与
------ ------- ------------- --------------
参与者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,参与者类型)
。普拉