我想在我的应用程序中为几个游戏设计一个架构。游戏可以是不同类型的,我想要创建的是一个很好的设计,为这些游戏提供开始列表。
游戏可以由个人或团队进行,开始列表可以是小组或决斗。开始列表类型给出了游戏类型:(我将使用与运动类比)
我在考虑这样的事情:
GameEvent
id
idGameType
idDuel //in case game type==2 or 4
决斗
id
idGameEvent
idPlayer1 //in case of gametype==2
idPlayer2
idTeam1 //in case of gametype==4
idTeam2
GameGroup (多对多映射)
id
idGameEvent
idPlayer //in case of gametype==1
idTeam //in case of gametype==3
这个解决方案是好的吗?还有另外一个更好吗?如果是,请解释原因。 其他解决方案(但我不确定)是基于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_id
和Player
表中的Team
一起用作约束。
答案 0 :(得分:2)
我普遍同意Kombajn的建议 - 将个人保持为团队(这是一种非常好的做法,通常在干净的设计中完成,简化了很多事情)等。但是:
我认为应该在Team
和GameEvent
之间保留多对多关系 - 团队应该能够参与更多活动。我会称这个表为Participation
。优点是您可以为每个参与添加属性(例如团队的结果)。
如果Player
- Team
关系,问题在于玩家是否可以成为更多团队的一部分。如果是,我们会再次建立多对多关系,并且需要额外的表格。
结果如下:
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)验证游戏中的团队数量和团队中的玩家数量。
注意这允许进一步扩展:例如,让新游戏类型有四个双人游戏团队。