Hay dos tablas:
- Usuario
- Habla a
El usuario contiene una referencia a la Dirección.
La dirección contiene las columnas CreatedBy y ModifiedBy, que hace referencia al usuario.
¿Cómo diseño esta base de datos para evitar una dependencia cíclica?
Hay dos tablas:
El usuario contiene una referencia a la Dirección.
La dirección contiene las columnas CreatedBy y ModifiedBy, que hace referencia al usuario.
¿Cómo diseño esta base de datos para evitar una dependencia cíclica?
Respuestas:
En lugar de buscar consejos y trucos (se incluyen restricciones diferidas), le sugiero que simplemente diseñe su salida de este "bloqueo de referencia", así que intente algo como esto:
Hechos
(UserID)
existe(AddressID)
fue creada por el usuario(UserID)
.(AddressID)
fue creada en Fecha(DateCreated)
.(AddressID)
fue modificada por última vez por el usuario(UserID)
en la fecha(ModifiedOn)
.(UserID)
reside en la dirección(AddressID)
desde la fecha(ValidFrom)
.Restricciones
Each
La dirección fue creada por el exactly one
usuario . It is possible that more than one
La dirección fue creada por el the same
usuario .
Each
Dirección fue creada en exactly one
Fecha . It is possible that more than one
Dirección fue creada en the same
Fecha .
For each
Dirección and
Fecha , la that
dirección fue modificada por el at most one
usuario en la that
fecha .
For each
and
Fecha del usuario , el that
usuario reside en la at most one
dirección desde la that
fecha .
Lógico
En lo que respecta a la dirección obligatoria, verifique eso en la capa de aplicación y envuelva las declaraciones de carga en una transacción, de esa manera obtendrá todo o nada.
No tiene más remedio que crear la dependencia cíclica en 2 operaciones como se muestra a continuación porque no existe una tabla cuando crea la primera.
CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));
ALTER TABLE A ADD B_FK INT;
Si desea evitar la dependencia cíclica. Luego debe eliminar una restricción REFERENCES o puede agregar una referencia DELETE y UPDATE CASCADE de una manera. También podría implementar un GATILLO si su lógica es algo compleja.