这个数据库看起来不错吗?我正常化了吗?

时间:2011-12-28 15:43:48

标签: mysql database normalization

我需要为我拥有的一些数据创建一个数据库,所以我对它进行了一次破解(正如你所希望的那样),现在我需要帮助对它进行最后的修改!你能帮我正常化吗?

我使用假数据

拍摄了我在Excel中创建的设计图片

enter image description here

你应该知道的是,有些游戏将播放5v5,有些将播放3v3。而不是为Team1P1,Team1P2,Team1P3等添加列,我想让专家帮我做这个。

问题:根据我的文件解析器,我的应用程序会知道游戏是否有6个玩家(3v3)或10个玩家(5v5)。如何构建数据库以将这些玩家映射回游戏?我应该在Player中添加指向Games的列吗?

,而不是尝试将Players数据放入Game ID表格中

球员
id | player_id | game_id |等...

编辑以澄清

Picture Starcraft 2,或在线玩的任何其他RTS游戏。当游戏开始时,它是一个全新的平板。一定数量的球员加入比赛(3v3或5v5)并相互比赛。在游戏结束时,每个人都有一定的统计值(他们输了还是输了?他们有多少金牌?他们有多少杀人,死亡,助攻?)

这些统计数据中的每一个都特定于该游戏中的该玩家。

如果我那天玩2场比赛,我会是这样的:

id | player_id | stat1 | stat2 | stat3 |
1 | 100 | 500 | 600 | 700个
2 | 100 | 300 | 999 | 2000

3 个答案:

答案 0 :(得分:2)

我会制作另一张桌子来映射玩家和游戏。

我还注意到你在播放器表中有统计数据。

为玩家统计数据创建另一个表可能是更好的选择。这样,如果您希望将来添加其他一些统计信息,则无需更改表格。

表game_players:

game id // PK
player id // PK

表格统计数据:

id
player id
type (e.g. stat1)
stat

答案 1 :(得分:2)

我大多同意PeeHaa的回答,尽管我有一些改变。首先,我同意您提出的两个表格中的id字段(pr0tocol)令人困惑,因为您还有game_idplayer_id字段。只需使用它们。

我也同意您应该有一个单独的game_players表格,该表格仅包含game_idplayer_id,并且这两个字段合并为表格的主键。

我觉得你的stats表应该与game_players表的键相同。这样,您不仅可以跟踪每个玩家的统计数据,而且还可以报告各个游戏的统计数据。

编辑:

游戏:

  key
game_id  |  game_length  |  game_mode  |  game_type  |  ranked

玩家:

   key
player_id  |  other player data - no stats in here

Game_Players

  key    |     key
game_id  |  player_id

统计

  key    |     key
game_id  |  player_id  |  stat1  |  stat2  |  stat3  |  etc...

使用这四个表格,您可以跟踪所有统计数据,并能够根据您选择的任何报告,根据玩家或游戏将其分开。现在分配单个玩家的游戏数量并不重要,因为它只是相关表格中关键字的一部分。

答案 2 :(得分:0)

Game
----
GameId
Length
Mode
Type
Ranked
PRIMARY KEY (GameId)

Team
----
TeamId
TeamName (only if you need it)
... other stuff about team
PRIMARY KEY (TeamId)

Player
------
PlayerId
PlayerName
... other stuff about player
PRIMARY KEY (PlayerId)

哪位球员参加哪支球队:

TeamPlayer
----------
TeamId
PlayerId
PRIMARY KEY (TeamId, PlayerId)
FOREIGN KEY (TeamId)
  REFERENCES Team(TeamId)
FOREIGN KEY (PlayerId)
  REFERENCES Player(PlayerId)

哪支队伍参加哪场比赛:

GameTeam
--------
GameId
TeamId
PRIMARY KEY (GameId, TeamId)
FOREIGN KEY (GameId)
  REFERENCES Game(GameId)
FOREIGN KEY (TeamId)
  REFERENCES Team(TeamId)

和统计数据:

GamePlayerStatistics
--------
GameId
TeamId
PlayerId
... statistics columns per player per game
PRIMARY KEY (GameId, PlayerId)
FOREIGN KEY (GameId, TeamId)
  REFERENCES GameTeam(GameId, TeamId)
FOREIGN KEY (TeamId, PlayerId)
  REFERENCES TeamPlayer(TeamId, PlayerId)

如果您的所有游戏都有两个游戏,那么可以删除GameTeam表。然后,您需要Game中的两列,例如Team1IdTeam2Id作为Team的外键,以及对Statistics表的一些修改。