SQL知道何时拆分表

时间:2009-07-23 16:35:07

标签: sql

我正在创建一个跟踪游戏重放的数据库。每次重播都有不同的游戏模式,可以是基于团队的游戏玩法,也可以是基于个人的游戏玩法。根据游戏模式,我想记录获胜团队或获胜个人。

我有以下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

性能方面,就最佳实践而言,是否可以这样做?是否有令人信服的理由将其拆分为每个游戏模式的单独表格(即使只有两种模式)?一个假设的情况如何不断添加游戏模式 - 通过为每个新游戏模式创建一个表格可以最好地解决这个问题吗?

3 个答案:

答案 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在讨论拆分/统一表格时值得了解...