我正在试图弄清楚如何使用Postgresql 8定义数据库的模式。
我有两张桌子:
Journals
,Books
定义我的出版物
Journal:
id_j, name, issn, other fields
Book:
id_b, name, isbn, author, other fields
我还有另一个表Scans
,它在逻辑上引用了前面的两个表。
Scans:
id, medium, source, status
每个Journal
或Book
可以有多个Scan
,但每个Scan
只能引用一个Journal
或Book
。< / p>
为了形式化,我的第一个想法是将两个外键放在Scans
中
Scans:
id, medium, source, status, id_j, id_b
并填写id_j
或id_b
但这个解决方案在我看来有点奇怪。
我不希望(如果可能的话)以这样的方式定义表:
Scans:
id, medium, source, status, id_other_table, other_table_name
因为我希望表格之间有正式的联系。
有什么想法吗?
答案 0 :(得分:6)
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'), id INT NOT NULL,
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 INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (type, id) REFERENCES source (type, id) ON DELETE CASCADE
);
CREATE TABLE scan (id INT NOT NULL, sourcetype CHAR(1) NOT NULL, sourceid INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (sourcetype, sourceid) REFERENCES source (type, id)
);
使用此设计,您不应直接从book
或journal
删除记录:而是从表source
中删除,这会将操作级联到相应的表。
您可以将book
和journal
共有的属性移至source
。