2v2游戏的数据库结构


10

我经常与12个朋友一起玩2v2游戏,我想要一个数据库来跟踪球员,球队,得分和比赛,以创建排名系统。

既然我们定期更换球队,我想出来的表格playersteamsgames在那里比赛有两支球队(TEAM1和TEAM2)和队由两名队员(PLAYER1和player2)。

这会引起很多问题-例如,如果我选择两个球员(让他们分别称为AB)一起玩,我必须检查是否已经存在一个其中Player1为A且Player2为B或Player1为B和Player2的球队是A。

表格和表格中都有列gameswins,但这是因为我既要查看玩家赢得了多少场比赛,又要查看玩家在不同团队中的兼容性(玩家与团队合作获胜的频率)其他特定玩家)。playersteams

  1. 排名记分牌(我可能会使用Elo评分系统
  2. 为每个球员提供的统计信息页面,其中包括评分,获胜,比赛,最近的比赛统计信息以及与他最兼容的球员。

我强烈怀疑其中许多内容违反了数据库规范化的某些原则,并且我很乐意就如何实施数据库设计提出一些建议。

数据库设计


我认为这是一个很好的问题。很高兴看到问题中您当前的数据库结构图。并非所有人都知道Laravel的Schema Builder。用例也可以得到更好的充实,以便我们了解您的实际需求。
candied_orange

非常感谢@CandiedOrange-我已经添加了数据库结构图,并将添加更多用例:)
Daniel Daniel

不错的更新。我假设每个球员一次只能出现在一个团队中,一次只能出现在一场比赛中,这是正确的吗?另外,这些球员离开并返回旧球队时没有重置该球队的信息吗?
candied_orange

@CandiedOrange基本上,当我们想玩游戏时,我们会找到4个玩家(总共〜12个玩家),并随机将他们分成2人。–
Daniel

我不知道那是是还是否。我试图了解时间如何影响您的设计。
candied_orange

Answers:


2

我在当前的架构中看到两个问题,一个是必须检查表中的两个字段以确定复合键是否有效地重复的问题,并且一些汇总数据汇总到各个表中以进行单独处理实体(尤其是获胜者,但也可能是玩家的等级)。

对于第一个问题,没有数据库中的技巧可以使复合键的任何一个/任何字段都以您要查找的OR方式进行处理,但是如果您的数据库支持,则可以创建一个函数getPlayerTeams(player_id)来封装查询。

(您还可以创建一个视图,其中team_thumbprint计算为已排序玩家ID的哈希值,因此,相同两个人的任何组合都始终产生相同的指纹,但这在这里可能要花很多钱)。

就标准化而言,请考虑通过使用team_result表跟踪给定团队的所有结果来将实体与发生的结果分离。更极端的归一化也需要一张player_rating_hist表格,其中包含玩家的所有评分更改。他们当前的评分只是最新日期。玩家视图也可以用于包含最新值,以便于查询。

拟议的架构(对不起,没有图表):

player
    id
    name
    created_on
    updated_on

player_rating_hist
    player_id (FK)
    rating
    rating_date

team
    id
    player1_id (FK)
    player2_id (FK)
    created_on
    updated_on

game
    id
    team1_id (FK)
    team2_id (FK)

team_game
    team_id (FK)
    game_id (FK)
    result
    score
    rating_change

team_rating_hist
    team_id (FK)
    rating
    rating_date

查询:

--Results for the game, should only ever be two rows for any given game
SELECT * FROM team_game WHERE game_id = 101

--All results for a team
SELECT * FROM team_game WHERE team_id = 123456 

这种结构允许将“基本”实体(玩家和团队)与由于系统随着时间的流逝而出现的“内容”分开,这意味着您不会用当前等级不断更新其中一个基本表,这些是派生值,应该通过获取最新评级,平均评级,COUNT赢或输等来检索。如果系统足够大,则可以考虑将此类汇总数据提取到单独的“仓库”中(即使它只是同一数据库中一组单独的表)也可以简化分析。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.