我有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的外键所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)