我正在创建一个跟踪游戏回放的数据库。每次重播都有不同的游戏模式,要么是基于团队的游戏模式,要么是基于个人的游戏模式。根据游戏模式,我想记录获胜的团队或获胜的个人。
我有以下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;使用我现在所拥有的,如果游戏模式是基于团队的,那么我将为每一轮设置winning_team_id,并将winning_player_id设置为null。同样,如果游戏模式是基于个人的,我会将winning_team_id设置为null。
从性能和最佳实践的角度来看,这样做可以吗?对于每种游戏模式(即使只有两种模式),是否有令人信服的理由将其划分为单独的表?假设不断添加游戏模式--通过为每个新的游戏模式创建一个表来最好地解决这个问题吗?
发布于 2009-07-23 16:42:53
我只有一个winning_id (删除团队和球员的个人获胜I)和一个额外的game_type_cd属性。这将是一个查找属性,它是一个名为GAME_TYPE_COES的新表的外键。然后您需要做的就是填写winning_id和游戏类型。这将允许无限数量的游戏类型,只需向GAME_TYPE_CODEs表添加数据,而不必更改数据结构。
发布于 2009-07-23 16:48:27
我认为这个数据库应该是关系型的--可能是一个(person/team-id)表,然后是一个表示gameid/(team/person-id)/win的表,然后是一个ID/replayinfo/etcetc的表。
所以..。
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
发布于 2009-07-23 16:49:19
我建议你读一下WP: Database normalization。尤其是在讨论拆分/统一表时,Normal Forms是值得了解的……
https://stackoverflow.com/questions/1172973
复制相似问题