复合主键的引用部分(referencing part of the composite primar

2019-10-20 05:31发布

我有设置数据库表中的引用问题。 我有以下结构:

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收缩会解决我的问题,故能保持状态“播放器(如果使用的话)属于俱乐部的一队”,但它是多余的其他工作人员类型。 你怎么看?

Answer 1:

当在一个表中的子行必须在另一个(参考)表中的子行,即夹杂物的依赖性(IND)。 例如,玩家TEAM_ID引用团队ID(而不是在团队键)。 当有IND 引用子行是一个关键,这是一个外键(FK)。 例如,玩家PERSON_ID引用人的ID(在人的关键)。 在SQL中的外键声明说,有一个IND和引用的列是唯一的。 (即,由PRIMARY KEY或UNIQUE声明)。 (因此,它实际上是指“国外超密钥”。)在SQL中,我们将理想申报IND(当有不也是FK)由CHECK约束。 (不过的DBMS不支持CHECK好)。 即检查播放器TEAM_ID是团队预计的ID。 但你想声明的SQL FK。 它失败,因为,作为错误消息称,球队ID不是唯一的。


(注意这里的区别评论队伍和他们的团队ID之间。因为一个团队的ID不能识别一个团队,你应该只说由一组ID和俱乐部标识的队伍。OOP 不仅要在世界车队和区分团队IDS(某种字符串)在世界上也是 “TEAM_ID”编程语言的指针/参考值。有人评论说ID”是一个不好的名字,因为一个团队的ID本身并不能识别一个团队。我们可以只使用世界上使用的术语。)

但是你真正想要的东西比这两个播放器表更强TEAM_ID IND和player_id FK。 即检查该TEAM_ID在俱乐部配对与在合同搭配是一个PERSON_ID一个为person_id玩家club_id。

这些复杂的约束实际上是不必要的,如果你的设计有关,比方说,花名册(club_id,TEAM_ID,player_id)并没有在球员已经TEAM_ID,可能没有任何合同。

不,我们不能“看到”的模式是“人引用俱乐部通过合同”。 (这句话是表达你的意思的一个好办法。)我们不能告诉大家,从表和钥匙。 每个表认为,满足其列名称参数一些语句行; 你必须给这些语句。 例如,对于玩家:人[为person_id]对[TEAM_ID]一些俱乐部确定了球队的戏剧。 你也必须给该限制的情况下可能会出现什么所有的业务规则。 例如:一个人可以承包给至多一个俱乐部。 团队属于最多一个俱乐部。 没有报表的用户(我们也)不能使用数据库,你(我们也)不能确定没有报表和业务规则的约束。 写出来。



Answer 2:

什么应该是唯一的在你的团队表中的列TEAM_ID。 目前,你做了什么意味着teamid可以,只要它去与不同的clubids,这是不正确重复。

该FK到club照顾已经你提到的0-n的关系。

编辑:有关系的问题回事。

由于团队只能属于1俱乐部,

  1. 的关系应该由一个外键来表示(在俱乐部表club_id指向)
  2. 主键不应该包括club_id

为什么? 包括主键club_id将意味着如果球队改变了俱乐部,这将改变fondamentally这是哪支球队。 除了事实,我不明白为什么球队会改变一个俱乐部,如果曾经发生了,球队会是一模一样的对象,从俱乐部完全独立的。

这将是一个可怕的概念错误不这样做。



文章来源: referencing part of the composite primary key