【发布时间】:2014-06-01 16:00:01
【问题描述】:
我在设置数据库表的引用时遇到问题。 我有以下结构:
CREATE TABLE club(
id INTEGER NOT NULL,
name_short VARCHAR(30),
name_full VARCHAR(70) NOT NULL
);
CREATE UNIQUE INDEX club_uix ON club(id);
ALTER TABLE club ADD CONSTRAINT club_pk PRIMARY KEY (id);
CREATE TABLE team(
id INTEGER NOT NULL,
club_id INTEGER NOT NULL,
team_name VARCHAR(30)
);
CREATE UNIQUE INDEX team_uix ON team(id, club_id);
ALTER TABLE team ADD CONSTRAINT team_pk PRIMARY KEY (id, club_id);
ALTER TABLE team ADD FOREIGN KEY (club_id) REFERENCES club(id);
CREATE TABLE person(
id INTEGER NOT NULL,
first_name VARCHAR(20),
last_name VARCHAR(20) NOT NULL
);
CREATE UNIQUE INDEX person_uix ON person(id);
ALTER TABLE person ADD PRIMARY KEY (id);
CREATE TABLE contract(
person_id INTEGER NOT NULL,
club_id INTEGER NOT NULL,
wage INTEGER
);
CREATE UNIQUE INDEX contract_uix on contract(person_id);
ALTER TABLE contract ADD CONSTRAINT contract_pk PRIMARY KEY (person_id);
ALTER TABLE contract ADD FOREIGN KEY (club_id) REFERENCES club(id);
ALTER TABLE contract ADD FOREIGN KEY (person_id) REFERENCES person(id);
CREATE TABLE player(
person_id INTEGER NOT NULL,
team_id INTEGER,
height SMALLINT,
weight SMALLINT
);
CREATE UNIQUE INDEX player_uix on player(person_id);
ALTER TABLE player ADD CONSTRAINT player_pk PRIMARY KEY (person_id);
ALTER TABLE player ADD FOREIGN KEY (person_id) REFERENCES person(id);
-- ALTER TABLE player ADD FOREIGN KEY (team_id) REFERENCES team(id); --this is not working
它给了我这个错误:
Error code -5529, SQL state 42529: a UNIQUE constraint does not exist on referenced columns: TEAM in statement [ALTER TABLE player ADD FOREIGN KEY (team_id) REFERENCES team(id)]
如您所见,team 表有复合主键(club_id + id),人通过合同引用俱乐部。 Person 对玩家和其他人员类型有一些共同的属性。
一个俱乐部可以拥有多支球队。雇员必须与俱乐部签订合同。球员(是个人的规格) - 如果使用 - 可以分配到俱乐部的一支球队。
有没有更好的方法来设计我的结构?我考虑过从团队的主键中排除 club_id,但我想知道这是否是唯一的方法。谢谢。
更新 1
我希望 id 仅作为俱乐部内部的团队标识,因此多个团队可以拥有相同的 id,只要它们属于不同的俱乐部。有可能吗?
更新 2 按照 philip 的建议更新了命名约定
为了更好地理解结构的一些业务规则:
- 一个俱乐部可以有 1..n 支球队(主队、预备队、青年队 或 A 队、B 队...只有球队可以比赛,不能参加俱乐部)
- 一支球队只属于一个俱乐部
- 球员是一类人(其他类型(工作人员)是球探、教练等,因此他们不需要属于特定球队,如果受雇,只属于俱乐部)
- 一个人可以与 1 个俱乐部签订 0..1 份合同(这意味着他有工作或失业)
- 球员(如果受雇)属于俱乐部的一支球队
现在考虑一下 - 将 team_id 从球员转移到合同将解决我的问题,并且它可以满足“球员(如果受雇)属于俱乐部的一支球队”的条件,但对于其他工作人员类型来说这将是多余的。你怎么看?
【问题讨论】:
-
是的,有更好的方法来设计你的结构。让
team_id成为team的主键,最好是自动递增。我看不出为什么在不同的俱乐部会使用相同的team_id。如果有“club_team_id”,则将其设为不同的列。 -
也许我可以利用这样的知识,在任何俱乐部中肯定有一支 id 为 0 的球队是主队,任何其他球队都可以是可选的,我认为没有理由让每支球队如果球队已经部分被俱乐部识别,则唯一 ID
-
在问题中解释 team_id 的含义:一个唯一值标识球队(这是“id”的正确使用)或仅仅是球队内俱乐部。 (显然是后者。)数据库用户(包括问答者)需要知道这一点。
-
@Zavael 。 . .我认为您混淆了这些实体的实体和属性。对于外部观察者来说,俱乐部是球队的一个属性,俱乐部的球队编号系统也是如此。
-
@philip 是的,我应该,但我没有任何具体含义,只是试图通过重用其他关系来最小化表格列
标签: sql database-design ddl composite-primary-key