Il existe deux tableaux:
- Utilisateur
- Adresse
L'utilisateur contient une référence à l'adresse.
L'adresse contient les colonnes CreatedBy et ModifiedBy, qui fait référence à l'utilisateur.
Comment concevoir cette base de données pour éviter une dépendance cyclique?
database-design
Shashi
la source
la source
Réponses:
Au lieu de rechercher des trucs et astuces (contraintes différées incluses), je vous suggère de concevoir simplement votre moyen de sortir de ce "verrou de référence" - alors essayez quelque chose comme ceci:
Les faits
(UserID)
existe.(AddressID)
été créée par l' utilisateur(UserID)
.(AddressID)
été créée le Date(DateCreated)
.(AddressID)
été modifiée pour la dernière fois par l' utilisateur(UserID)
à la date(ModifiedOn)
.(UserID)
réside à l' adresse(AddressID)
depuis la date(ValidFrom)
.Contraintes
Each
L'adresse a été créée par l'exactly one
utilisateur .It is possible that more than one
L'adresse a été créée par l'the same
utilisateur .Each
L'adresse a été créée leexactly one
Date .It is possible that more than one
L'adresse a été créée lethe same
Date .For each
and
Date de l' adresse , l'that
adresse a été modifiée par l'at most one
utilisateur à lathat
date .For each
and
Date de l' utilisateur , l'that
utilisateur réside l'at most one
adresse depuis lathat
date .Logique
En ce qui concerne l'adresse obligatoire, vérifiez cela sur la couche application et encapsulez les instructions de chargement dans une transaction - de cette façon, vous obtiendrez tout ou rien.
la source
Vous n'avez pas d'autre choix que de créer la dépendance cyclique en 2 opérations comme ci-dessous car une table n'existe pas lorsque vous créez la première.
Si vous souhaitez éviter la dépendance cyclique. Ensuite, vous devez supprimer une contrainte REFERENCES ou vous pouvez ajouter une référence DELETE et UPDATE CASCADE dans un sens. Vous pouvez également implémenter un TRIGGER si votre logique est quelque peu complexe.
la source