mocodo icon indicating copy to clipboard operation
mocodo copied to clipboard

Problèmes avec l'héritage en cascade

Open laowantong opened this issue 4 months ago • 0 comments

Single table inheritance

Le MCD suivant présente un héritage en cascade avec absorption dans la table-mère :

PARENT: id parent, attr parent
/XT\ PARENT <- CHILD A, CHILD B
CHILD A: attr child A
/XT\ CHILD A <- GRANDCHILD A, GRANDCHILD B
GRANDCHILD A: attr grandchild A
DF, 1N GRANDCHILD A, 11 OTHER
OTHER: id other, attr other
    
:
CHILD B: attr child B
:
GRANDCHILD B: attr grandchild B
:
:
:

image

Le schéma relationnel expliqué ci-dessus est faux :

  1. Dans PARENT, il manque les attributs des petits-enfants.
  2. Dans OTHER, dire que « id parent [...] a migré [...] à partir de l'entité CHILD A » est insuffisant. Il a migré à partir de l'entité PARENT (en passant par CHILD A et CHILD B).

Le problème 1 n'a pas été exploré.

Le problème 2 a une autre effet de bord, empêcher le tracé du diagramme relationnel généré :

%%mocodo
:
PARENT: id parent, attr parent, attr child A, attr child B
:
OTHER: id other, attr other, #id parent > CHILD A > id parent
:

Ci-dessus, il faudrait PARENT au lieu de CHILD A. Ce calcul erroné est fait par la fonction suivante, qui devrait remonter jusqu'à une entité qui n'appartienne pas à self.inheritance_parent_or_children_to_delete :

https://github.com/laowantong/mocodo/blob/f8c72ca5df365d25f78d0fec5d91e7baee8f3956/mocodo/convert/relations.py#L231-L236


Class table inheritance

L'héritage par référence en cascade semble fonctionner :

PARENT: id parent, attr parent
/XT\ PARENT -> CHILD A, CHILD B
CHILD A: attr child A
/XT\ CHILD A -> GRANDCHILD A, GRANDCHILD B
GRANDCHILD A: attr grandchild A
DF, 1N GRANDCHILD A, 11 OTHER
OTHER: id other, attr other
    
:
CHILD B: attr child B
:
GRANDCHILD B: attr grandchild B
:
:
:

image

Dans les explications, les références aux tables d'origine (PARENT, CHILD A, GRANDCHILD A) sont tolérables. En tout cas, elles n'empêchent pas le tracé du diagramme relationnel.

image

Concrete table inheritance

L'héritage en cascade avec absorption dans les tables-filles semble également fonctionner.

PARENT: id parent, attr parent
/XT\ PARENT => CHILD A, CHILD B
CHILD A: attr child A
/XT\ CHILD A => GRANDCHILD A, GRANDCHILD B
GRANDCHILD A: attr grandchild A
DF, 1N GRANDCHILD A, 11 OTHER
OTHER: id other, attr other
    
:
CHILD B: attr child B
:
GRANDCHILD B: attr grandchild B
:
:
:

image

Par contre, le diagramme relationnel est déconnecté.

image

Est-ce le comportement attendu ? À vérifier.

Discussion

  • La gestion correcte des héritages en cascade demanderait vraisemblablement une révision en profondeur du code existant dans relations.py.
  • À défaut de la prendre en charge, le mieux serait de lever une erreur pour interdire ces configurations.
  • Le problème semble en tout cas distinct de celui de #118.

laowantong avatar Oct 16 '24 20:10 laowantong