2010-03-24 5 views
3

J'essaie de comprendre comment définir le schéma d'une base de données avec Postgresql 8.postgresql: clé étrangère soit tableA ou tableB

J'ai 2 tables:

Journals, Books

qui définissent les publications je

Journal: 
id_j, name, issn, other fields 

Book: 
id_b, name, isbn, author, other fields 

et j'ai une autre table Scans qui fait référence à la fois logiquement l'onglet précédent les.

Scans: 
id, medium, source, status 

chaque Journal ou Book peut avoir plus d'un Scan, mais chacun peut se référer Scan un seul Journal ou Book.

Pour formaliser cela, ma première idée était de mettre deux clés étrangères dans Scans comme

Scans: 
id, medium, source, status, id_j, id_b 

et remplir soit id_j ou id_b

mais cette solution me semble un peu bizarre.

Je ne veux pas (s'il est possible) pour définir la table d'une manière comme ceci:

Scans: 
id, medium, source, status, id_other_table, other_table_name 

parce que je voudrais avoir un lien formel entre les tables.

Une idée?

Répondre

5
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) 
); 

Avec cette conception, vous ne devez pas supprimer des enregistrements directement à partir book ou journal: au lieu, supprimer de la table source qui cascade l'opération à la table appropriée. Vous pouvez déplacer les attributs communs à book et journal à source.

+0

votre réponse confirme ce que je pensais: je dois normaliser ma base de données ... –

+0

Oui, la normalisation aide habituellement. Dénormaliser la base de données après la normalisation, pas avant. –

Questions connexes