Alcune persone usano un design chiamato polimorfi Associazioni per fare questo, permettendo vehicle_id
per contenere un valore che esiste sia in car
o motor
tabelle. Poi aggiungere un vehicle_type
che i nomi tavolo che la riga data in t1
riferimenti.
il guaio è che non è possibile dichiarare un vero SQL vincolo di chiave esterna se fate questo. non c'è alcun supporto in SQL per una chiave esterna che ha multipl e obiettivi di riferimento. Ci sono anche altri problemi, ma la mancanza di integrità referenziale è già un rompicapo.
Un disegno migliore è prendere in prestito un concetto dalla progettazione OO di un supertipo comune sia car
e motor
:
CREATE TABLE Identifiable (
id SERIAL PRIMARY KEY
);
Poi fare riferimento t1
questa tabella supertype:
CREATE TABLE t1 (
vehicle_id INTEGER NOT NULL,
FOREIGN KEY (vehicle_id) REFERENCES identifiable(id)
...
);
E anche fare in modo che i sottotipi facciano riferimento al loro supertipo genitore. Si noti che la chiave primaria dei sottotipi è non autoincremento. Il supertipo genitore si occupa di allocare un nuovo valore id, e i bambini fanno riferimento solo a quel valore.
CREATE TABLE car (
id INTEGER NOT NULL,
FOREIGN KEY (id) REFERENCES identifiable(id)
...
);
CREATE TABLE motor (
id INTEGER NOT NULL,
FOREIGN KEY (id) REFERENCES identifiable(id)
...
);
Ora è possibile avere una vera integrità referenziale, ma anche supportare più tabelle di sottotipi con i propri attributi.
La risposta di @Quassnoi mostra pure un metodo per applicare sottotipi disgiunti. Cioè, si desidera impedire sia a car
e a motor
di fare riferimento alla stessa riga nella tabella dei supertipi padre. Quando eseguo questa operazione, utilizzo una chiave primaria a singola colonna per Identifiable.id
ma dichiaro anche una chiave UNIQUE
su Identifiable.(id, type)
. Le chiavi esterne in car
e motor
possono fare riferimento alla chiave univoca a due colonne anziché alla chiave primaria.
fonte
2009-11-13 17:34:17
La chiave surrogata per 'identificabile 'è valida solo quando ci sono attributi in' identificabile 'che la query deve selezionare. Se 'identificabile 'serve solo a far rispettare i vincoli, l'uso di una chiave composita consente di eliminarlo in modo competente nelle query. – Quassnoi
Ho ideato e utilizzato l'approccio "comune supertipo" e l'ho usato con successo nei principali progetti di migrazione/sviluppo del sistema. (Governo NZ, SPOT25 per MoE) –