如何处理2个几乎相同的表

时间:2012-12-20 04:19:44

标签: sql sqlite

我有一张棒球统计数据表,如下所示:

CREATE TABLE batting_stats(
    ab                INTEGER,
    pa                INTEGER,
    r                 INTEGER,
    h                 INTEGER,
    hr                INTEGER,
    rbi               INTEGER,
    playerID          INTEGER,
    FOREIGN KEY(playerID) REFERENCES player(playerID)
);

但是我有一张基本完全相同的统计表,但对于一个团队来说:

CREATE TABLE team_batting_stats(
    ab                INTEGER,
    pa                INTEGER,
    r                 INTEGER,
    h                 INTEGER,
    hr                INTEGER,
    rbi               INTEGER,
    teamID            INTEGER,
    FOREIGN KEY(teamID) REFERENCES team(teamID)
);

我的第一直觉是废弃外键并概括ID,但我仍然有问题,我有这两个表,他们不能有重叠的ID:

CREATE TABLE player(
    playerID    INTEGER PRIMARY KEY,
    firstname   TEXT,
    lastname    TEXT,
    number      INTEGER,
    teamID      INTEGER,
    FOREIGN KEY(teamID) REFERENCES team(teamID)
);

CREATE TABLE team(
    teamID      INTEGER PRIMARY KEY,
    name        TEXT,
    city        TEXT,
);

我觉得我忽略了一些可以解决这个问题并将统计数据减少到一张桌子的明显事物。

2 个答案:

答案 0 :(得分:1)

您需要重新审视数据的结构以及尝试捕获数据的内容(以及如何)。如果团队是" permenant"像一个大联盟俱乐部或临时像一个小联盟球队。前者比后者更容易,但后者的解决方案也适用于前者。

你还需要决定你想要保持数据的标准化程度 - 如果你知道哪个击球手面对哪个投手比投手统计数据可以从击球数据中得出,但这可能是比其值得更加复杂的。

原子项是玩家,团队和游戏。交易将会发生,但我猜他们不会发生在第6局和第7局之间。所以游戏是团队和玩家之间的联系。

所以你得到的表格如下:

PlayerID   Name    Dog's Name
   1       Fred     Fluffy
   2       Joe      Spike

TeamID    Name      Mascot
   1      Chicago   Comets
   2      Timbuktu  Pussy Cats

GameID    Date        Location     Season
   1      2012-18-12  Over there    2012
   2      2011-20-4   The Park      2011

GameID    PlayerID   TeamID     AllTheStatsFromThisPlayerAtThisGame
   1         1          1
   1         2          2

玩家统计数据是他玩过的所有游戏的集合。 所有比赛都是团队中所有球员的集合。

答案 1 :(得分:1)

如果你想将统计数据减少到一个表,你可以添加几个关系表来将一个击球手或一个团队链接到统计表。

实体表:

CREATE TABLE stats(
    statsID          INTEGER primary key,
    ab                INTEGER,
    pa                INTEGER,
    r                 INTEGER,
    h                 INTEGER,
    hr                INTEGER,
    rbi               INTEGER
);

CREATE TABLE player(
    playerID    INTEGER PRIMARY KEY,
    firstname   TEXT,
    lastname    TEXT,
    number      INTEGER,
    teamID      INTEGER,
    FOREIGN KEY(teamID) REFERENCES team(teamID)
);

CREATE TABLE team(
    teamID      INTEGER PRIMARY KEY,
    name        TEXT,
    city        TEXT,
);

将击球手/球队与统计数据相关联的关系表:

CREATE TABLE batting_stats(
    playerID integer not null REFERENCES player(playerID),
    statsID integer not null REFERENCES stats(statsID),
    primary key (playerID, statsID)
);

CREATE TABLE team_batting_stats(
    teamID integer not null REFERENCES team(teamID),
    statsID integer not null REFERENCES stats(statsID),
    primary key (teamID, statsID)
);