Algunas personas utilizan un diseño llamado Asociaciones polimórficos hacer esto, lo que permite vehicle_id
para contener un valor que existe ya sea en car
o motor
tablas. A continuación, agregue un vehicle_type
que nombra la tabla que la fila dada en t1
referencias.
El problema es que no puede declarar una restricción de clave externa de SQL real si hace esto. No hay soporte en SQL para una clave externa que tiene multiplicar e objetivos de referencia. También hay otros problemas, pero la falta de integridad referencial ya es un factor decisivo.
Un diseño mejor es pedir prestado un concepto de diseño orientado a objetos de un supertipo común de ambos car
y motor
:
CREATE TABLE Identifiable (
id SERIAL PRIMARY KEY
);
A continuación, hacer referencia t1
esta tabla supertipo:
CREATE TABLE t1 (
vehicle_id INTEGER NOT NULL,
FOREIGN KEY (vehicle_id) REFERENCES identifiable(id)
...
);
Y también hace que los subtipos hagan referencia a su supertipo principal. Tenga en cuenta que la clave principal de los subtipos es no autoincrementando. El supertipo principal se encarga de asignar un nuevo valor de identificación, y los hijos solo hacen referencia a ese valor.
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)
...
);
Ahora puede tener verdadera integridad referencial, pero también admite múltiples tablas de subtipos con sus propios atributos.
La respuesta por @Quassnoi muestra también un método para hacer cumplir subtipos disjuntos. Es decir, desea evitar que car
y motor
hagan referencia a la misma fila en su tabla de supertipo principal. Cuando hago esto, utilizo una clave primaria de una sola columna para Identifiable.id
pero también declaro una clave UNIQUE
sobre Identifiable.(id, type)
. Las claves externas en car
y motor
pueden hacer referencia a la clave única de dos columnas en lugar de a la clave principal.
La clave sustituta para "identificable" solo es válida cuando hay atributos en "identificable" que la consulta debe seleccionar. Si 'identificable' solo sirve para hacer cumplir las restricciones, el uso de una clave compuesta permitirá deshacerse de él en las consultas por completo. – Quassnoi
He creado y utilizado el enfoque de "supertipo común" y lo utilicé con éxito en proyectos importantes de migración/reurbanización de sistemas. (Gobierno de Nueva Zelanda, SPOT25 para MoE) –