我有一张棒球统计数据表,如下所示:
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,
);
我觉得我忽略了一些可以解决这个问题并将统计数据减少到一张桌子的明显事物。
答案 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)
);