微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关系模式和完整性约束

如何解决关系模式和完整性约束

请问是否可以使用创建脚本在此架构上创建这些完整性约束?

  1. 俱乐部 (klub) 只能有一名教练 (trener)
  2. 俱乐部只能有一个所有者 (majitel)
  3. 每个成员 (člen) 只能加入一个俱乐部
  4. 教练只能为他的俱乐部制定战术(taktika)?

是否可以通过创建脚本中的完整性约束来解决这个问题,或者是否使用了触发器?我是我创建脚本的一部分。

架构

enter image description here

创建脚本

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 表(成员)添加带有角色信息的新列,或向 trenermajitel 表添加俱乐部信息。因为一个成员可以有多个角色,所以第一个解决方案不是一种选择。

仅添加俱乐部可能会导致数据一致性问题(有人会更改会员的俱乐部 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_clubfk_owner_club 外键约束,尽管它们不是强制性的。 fk_member_clubfk_owner_member_and_clubfk_coach_member_and_club 一起确保 club_idowner 表中的 coach 值始终有效,但如果我觉得很自然有这些 FK。

要求。 3 每个成员 (člen) 只能在一个俱乐部中您的架构中无需更改任何内容,成员具有俱乐部属性,无法将另一个俱乐部分配给单个成员。

Req.4 没有特殊限制,教练只能为他的俱乐部制定战术(taktika),因为战术是由分配给单个俱乐部的教练制定的,所以没有需要约束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。