我正在创建一个跟踪游戏重放的数据库。每次重播都有不同的游戏模式,可以是基于团队的游戏玩法,也可以是基于个人的游戏玩法。根据游戏模式,我想记录获胜团队或获胜个人。
我有以下MySQL表来跟踪重播中的回合以及相关的赢家:
CREATE TABLE replay_rounds (
replay_id INT UNSIGNED NOT NULL,
round SMALLINT UNSIGNED NOT NULL,
winning_player_id INT UNSIGNED,
winning_team_id TINYINT UNSIGNED,
FOREIGN KEY (replay_id) REFERENCES replays(id),
FOREIGN KEY (replay_id, winning_player_id) REFERENCES replay_players(replay_id, player_id),
FOREIGN KEY (winning_team_id) REFERENCES teams(id),
PRIMARY KEY (replay_id, round))
CHARACTER SET=utf8
COLLATE=utf8_general_ci
ENGINE=InnoDB;
使用我现在拥有的,如果游戏模式是基于团队的,那么我将为每轮设置wins_team_id并将winner_player_id设置为null
。同样,如果游戏模式是基于个人的,我会将winner_team_id设置为null
。
性能方面,就最佳实践而言,是否可以这样做?是否有令人信服的理由将其拆分为每个游戏模式的单独表格(即使只有两种模式)?一个假设的情况如何不断添加游戏模式 - 通过为每个新游戏模式创建一个表格可以最好地解决这个问题吗?
答案 0 :(得分:1)
我只有一个wins_id(为团队和玩家丢弃各个获胜的ID)以及game_type_cd的附加属性。这将是一个lookup属性,它是一个名为GAME_TYPE_COES的新表的外键。然后你需要做的就是填写wins_id和游戏类型。这将允许无限量的游戏类型,只需将数据添加到GAME_TYPE_CODEs表,而不必更改数据结构。
答案 1 :(得分:0)
我认为这个数据库应该是关系型的 - 也许是(person / team-id)的1个表,然后是表示gameid /(team / person-id)/ win的另一个表,然后是另一个有ID / replayinfo / etcetc < / p>
所以..
TeamID | Name
-------------
1 | Thunderbirds
2 | John Petravich
GameID | TeamID | Win?
-----------------------
1 | 1 | 1
2 | 2 | 0
ReplayID | GameID | (Your table's other properties)
----------------------------------
1 | 1 | etc
现在,您可以使用该关系来确定有关特定团队或个人的所有不同信息。如果您需要根据页面的类型来定制页面,请在第一个表格中添加一个类型列,并根据该类型ID显示您的页面。
$ 02
答案 2 :(得分:0)
我建议您阅读WP: Database normalization。特别是Normal Forms在讨论拆分/统一表格时值得了解...