我有设置数据库表中的引用问题。 我有以下结构:
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)]
正如你所看到的,球队表有复合主键(club_id + ID),通过合同的人引用俱乐部。 人有球员和其他工作人员类型的一些共同的属性。
一家具乐部可以有多个团队。 就业人员必须有与俱乐部的合同。 播放器(是人的规范) - 如果酵母以前 - 可以分配给俱乐部的球队之一。
有没有更好的方式来设计我的结构? 我想过不包括球队的主键club_id,但我想知道,如果这是唯一的办法。 谢谢。
更新1
我想有ID作为只在俱乐部队身份,所以多支球队可以,只要他们属于不同的俱乐部有平等的ID。 可能吗?
更新2更新的命名约定由菲利普为劝
一些业务规则,以更好地了解数据的结构:
- 一家具乐部可以有1..1团队(主要阵容,预备队,青年队和A队,B队......唯一一支可以打比赛,而不是俱乐部)
- 一队属于一个俱乐部只
- 选手A型的人(其他类型的(人员)是球探,教练等,使他们不需要属于特定团队,只是在俱乐部,如果使用的话)
- 人可以有0..1合同与1发球杆(这意味着他采用或无业)
- 播放器(如果使用的话)属于俱乐部的一队
现在考虑这个问题 - 从球员移动TEAM_ID收缩会解决我的问题,故能保持状态“播放器(如果使用的话)属于俱乐部的一队”,但它是多余的其他工作人员类型。 你怎么看?