Oracle
 sql >> Base de données >  >> RDS >> Oracle

Modélisation d'une relation un-à-constante

Faire cela pour qu'il soit sain et correct même lorsque plusieurs sessions effectuent des mises à jour n'est pas facile. Vous vous mettrez dans le pétrin si vous essayez cela avec des déclencheurs, et les contraintes déclaratives d'Oracle ne sont pas assez puissantes pour l'exprimer.

Cela peut être fait comme suit :-

  1. Créer un journal de vue matérialisé sur les tables parent et enfant
  2. Créez une vue de jointure matérialisée qui les joint et compte le nombre d'enfants regroupés par le parent. Cela doit être REFRESH FAST ON COMMIT
  3. Mettez une contrainte sur la vue de jointure matérialisée selon laquelle le nombre d'enregistrements enfants doit être égal à "n" (la constante de votre base de données)

Vous pouvez ensuite faire une série d'instructions d'insertion/mise à jour/suppression. Lorsque vous validez, la vue matérialisée sera actualisée et si la condition n'est pas remplie, vous obtiendrez une erreur de violation de contrainte à ce stade.

Une astuce supplémentaire consiste à n'inclure que les lignes qui échouent à la contrainte dans la vue matérialisée (HAVING count(ChildId) <> 5) afin de ne pas gaspiller d'espace de stockage.