问题描述
请问是否可以使用创建脚本在此架构上创建这些完整性约束?
是否可以通过创建脚本中的完整性约束来解决这个问题,或者是否使用了触发器?我是我创建脚本的一部分。
架构
创建脚本
CREATE TABLE club (
id_club SERIAL NOT NULL,nazev VARCHAR(256) NOT NULL,datum_zalozeni VARCHAR(256) NOT NULL
);
ALTER TABLE club ADD CONSTRAINT pk_club PRIMARY KEY (id_club);
ALTER TABLE club ADD CONSTRAINT uc_club_nazev UNIQUE (nazev);
CREATE TABLE coach (
id_member INTEGER NOT NULL
);
ALTER TABLE coach ADD CONSTRAINT pk_coach PRIMARY KEY (id_member);
CREATE TABLE member (
id_member SERIAL NOT NULL,id_club INTEGER NOT NULL,jmeno VARCHAR(256) NOT NULL,prijmeni VARCHAR(256) NOT NULL,narodnost VARCHAR(256) NOT NULL,datum_narozeni VARCHAR(256) NOT NULL
);
ALTER TABLE member ADD CONSTRAINT pk_member PRIMARY KEY (id_member);
CREATE TABLE owner (
id_member INTEGER NOT NULL
);
ALTER TABLE owner ADD CONSTRAINT pk_owner PRIMARY KEY (id_member);
CREATE TABLE player (
id_member INTEGER NOT NULL,cislo VARCHAR(256) NOT NULL,post VARCHAR(256) NOT NULL
);
ALTER TABLE player ADD CONSTRAINT pk_player PRIMARY KEY (id_member);
ALTER TABLE coach ADD CONSTRAINT fk_coach_member FOREIGN KEY (id_member) REFERENCES member (id_member) ON DELETE CASCADE;
ALTER TABLE member ADD CONSTRAINT fk_member_club FOREIGN KEY (id_club) REFERENCES club (id_club) ON DELETE CASCADE;
ALTER TABLE owner ADD CONSTRAINT fk_owner_member FOREIGN KEY (id_member) REFERENCES member (id_member) ON DELETE CASCADE;
ALTER TABLE player ADD CONSTRAINT fk_player_member FOREIGN KEY (id_member) REFERENCES member (id_member) ON DELETE CASCADE;
enter code here
enter code here
解决方法
无法对当前架构强制执行所需的约束。您需要的是唯一约束,但唯一约束适用于单个表数据,并且您没有包含成员角色和俱乐部信息的表。
为了实现这些目标,您必须向 clen
表(成员)添加带有角色信息的新列,或向 trener
和 majitel
表添加俱乐部信息。因为一个成员可以有多个角色,所以第一个解决方案不是一种选择。
仅添加俱乐部可能会导致数据一致性问题(有人会更改会员的俱乐部 ID,但不会更改教练的 ID)。为了确保完整性,我在一对 (member_id
,club_id
) 上添加了外键。
结果是:
CREATE TABLE club (
id_club SERIAL NOT NULL,nazev VARCHAR(256) NOT NULL,datum_zalozeni VARCHAR(256) NOT NULL
);
ALTER TABLE club ADD CONSTRAINT pk_club PRIMARY KEY (id_club);
ALTER TABLE club ADD CONSTRAINT uc_club_nazev UNIQUE (nazev);
CREATE TABLE coach (
id_member INTEGER NOT NULL
);
ALTER TABLE coach ADD CONSTRAINT pk_coach PRIMARY KEY (id_member);
CREATE TABLE member (
id_member SERIAL NOT NULL,id_club INTEGER NOT NULL,jmeno VARCHAR(256) NOT NULL,prijmeni VARCHAR(256) NOT NULL,narodnost VARCHAR(256) NOT NULL,datum_narozeni VARCHAR(256) NOT NULL
);
ALTER TABLE member ADD CONSTRAINT pk_member PRIMARY KEY (id_member);
CREATE TABLE owner (
id_member INTEGER NOT NULL
);
ALTER TABLE owner ADD CONSTRAINT pk_owner PRIMARY KEY (id_member);
CREATE TABLE player (
id_member INTEGER NOT NULL,cislo VARCHAR(256) NOT NULL,post VARCHAR(256) NOT NULL
);
ALTER TABLE player ADD CONSTRAINT pk_player PRIMARY KEY (id_member);
ALTER TABLE coach ADD CONSTRAINT fk_coach_member FOREIGN KEY (id_member) REFERENCES member (id_member) ON DELETE CASCADE;
ALTER TABLE member ADD CONSTRAINT fk_member_club FOREIGN KEY (id_club) REFERENCES club (id_club) ON DELETE CASCADE;
ALTER TABLE owner ADD CONSTRAINT fk_owner_member FOREIGN KEY (id_member) REFERENCES member (id_member) ON DELETE CASCADE;
ALTER TABLE player ADD CONSTRAINT fk_player_member FOREIGN KEY (id_member) REFERENCES member (id_member) ON DELETE CASCADE;
--We need a unique constraint on (id_member,id_club),to be able to use the pair in a foreign key.
ALTER TABLE member ADD CONSTRAINT unq_member_and_club UNIQUE(id_member,id_club);
--Req. 1: club (klub) can have exactly one coach (trener)
ALTER TABLE coach ADD COLUMN id_club integer;
ALTER TABLE coach ADD CONSTRAINT fk_coach_club FOREIGN KEY (id_club) REFERENCES club (id_club);
ALTER TABLE coach ADD CONSTRAINT fk_coach_member_and_club FOREIGN KEY (id_member,id_club) REFERENCES member (id_member,id_club);
ALTER TABLE coach ADD CONSTRAINT fk_single_coach_per_club UNIQUE(id_club);
--Req. 2: club can have just one owner (majitel)
ALTER TABLE owner ADD COLUMN id_club integer;
ALTER TABLE owner ADD CONSTRAINT fk_owner_club FOREIGN KEY (id_club) REFERENCES club (id_club);
ALTER TABLE owner ADD CONSTRAINT fk_owner_member_and_club FOREIGN KEY (id_member,id_club);
ALTER TABLE owner ADD CONSTRAINT fk_single_owner_per_club UNIQUE(id_club);
您可以在 db<>fiddle 中测试脚本。
请注意,我添加了 fk_coach_club
和 fk_owner_club
外键约束,尽管它们不是强制性的。 fk_member_club
、fk_owner_member_and_club
和 fk_coach_member_and_club
一起确保 club_id
和 owner
表中的 coach
值始终有效,但如果我觉得很自然有这些 FK。
要求。 3 每个成员 (člen) 只能在一个俱乐部中您的架构中无需更改任何内容,成员具有俱乐部属性,无法将另一个俱乐部分配给单个成员。
Req.4 没有特殊限制,教练只能为他的俱乐部制定战术(taktika),因为战术是由分配给单个俱乐部的教练制定的,所以没有需要约束。