1

我有一个棒球统计表,如下所示:

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,但我仍然有一个问题,我有这 2 个表,它们不能有重叠的 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,
);

我觉得我忽略了一些明显可以解决这个问题并将统计信息减少到单个表的东西。

4

2 回答 2

1

您需要重新审视数据的结构以及您尝试捕获数据的内容(以及方式)。球队是像大联盟俱乐部那样“永久”还是像小联盟球队那样临时是有区别的。前者比后者更容易,但后者的解决方案也适用于前者。

您还需要确定要保留数据的标准化程度 - 如果您知道哪个击球手面对哪个投手而不是投手统计数据可以从击球统计数据中得出,但这可能比它的价值更复杂。

原子项目是玩家、团队和游戏。交易会发生,但我猜它们不会在第 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

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

于 2012-12-20T05:02:05.563 回答
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)
);
于 2012-12-20T05:21:06.490 回答