我试图找出如何使用
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常用的属性移动到源.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。