加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql:tableA或tableB的外键

发布时间:2020-12-13 15:59:23 所属栏目:百科 来源:网络整理
导读:我试图找出如何使用 Postgresql 8定义数据库的模式. 我有2张桌子: 期刊,书籍 定义我的出版物 Journal:id_j,name,issn,other fieldsBook:id_b,isbn,author,other fields 我有另一个表扫描逻辑上引用前面的表. Scans:id,medium,source,status 每个日记本或书
我试图找出如何使用 Postgresql 8定义数据库的模式.

我有2张桌子:

期刊,书籍

定义我的出版物

Journal:
id_j,name,issn,other fields

Book:
id_b,isbn,author,other fields

我有另一个表扫描逻辑上引用前面的表.

Scans:
id,medium,source,status

每个日记本或书籍可以有多个扫描,但每个扫描只能引用一个日记或书.

为了形式化,我的第一个想法是将两个外键放在Scans中

Scans:
id,status,id_j,id_b

并填写id_j或id_b

但这个解决方案在我看来有点奇怪.

我不希望(如果可能的话)以这样的方式定义表:

Scans:
id,id_other_table,other_table_name

因为我希望表之间有正式的联系.

任何的想法?

解决方法

CREATE TABLE source (
       type CHAR(1) NOT NULL CHECK (type IN ('J','B')),id INT NOT NULL,PRIMARY KEY (type,id)
);

CREATE TABLE book (
       type CHAR(1) NOT NULL CHECK(type = 'B'),PRIMARY KEY (id),FOREIGN KEY (type,id) REFERENCES source (type,id) ON DELETE CASCADE
);

CREATE TABLE journal (
       type CHAR(1) NOT NULL CHECK(type = 'J'),id) ON DELETE CASCADE
);

CREATE TABLE scan (id INT NOT NULL,sourcetype CHAR(1) NOT NULL,sourceid INT NOT NULL,FOREIGN KEY (sourcetype,sourceid) REFERENCES source (type,id)
);

使用此设计,您不应直接从书籍或日志中删除记录:而是从表源中删除,这会将操作级联到相应的表.

您可以将book和journal常用的属性移动到源.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读