首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >知道何时拆分表的SQL

知道何时拆分表的SQL
EN

Stack Overflow用户
提问于 2009-07-23 16:35:07
回答 3查看 516关注 0票数 0

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

我有以下MySQL表,跟踪回放中的轮次和相关的获胜者:

代码语言:javascript
复制
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

从性能和最佳实践的角度来看,这样做可以吗?对于每种游戏模式(即使只有两种模式),是否有令人信服的理由将其划分为单独的表?假设不断添加游戏模式--通过为每个新的游戏模式创建一个表来最好地解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-23 16:42:53

我只有一个winning_id (删除团队和球员的个人获胜I)和一个额外的game_type_cd属性。这将是一个查找属性,它是一个名为GAME_TYPE_COES的新表的外键。然后您需要做的就是填写winning_id和游戏类型。这将允许无限数量的游戏类型,只需向GAME_TYPE_CODEs表添加数据,而不必更改数据结构。

票数 1
EN

Stack Overflow用户

发布于 2009-07-23 16:48:27

我认为这个数据库应该是关系型的--可能是一个(person/team-id)表,然后是一个表示gameid/(team/person-id)/win的表,然后是一个ID/replayinfo/etcetc的表。

所以..。

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2009-07-23 16:49:19

我建议你读一下WP: Database normalization。尤其是在讨论拆分/统一表时,Normal Forms是值得了解的……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1172973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档