postgresql:tableA或tableB的外键

postgresql:tableA或tableB的外键,第1张

概述我试图找出如何使用 Postgresql 8定义数据库的模式. 我有2张桌子: 期刊,书籍 定义我的出版物 Journal:id_j, name, issn, other fieldsBook:id_b, name, isbn, author, other fields 我有另一个表扫描逻辑上引用前面的表. Scans:id, medium, source, status 每个日记本或书 我试图找出如何使用 Postgresql 8定义数据库的模式.

我有2张桌子:

期刊,书籍

定义我的出版物

Journal:ID_j,name,issn,other fIEldsBook: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常用的属性移动到源.

总结

以上是内存溢出为你收集整理的postgresql:tableA或tableB的外键全部内容,希望文章能够帮你解决postgresql:tableA或tableB的外键所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160560.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存