mocodo
mocodo copied to clipboard
Problèmes avec l'héritage en cascade
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
:
:
:
Le schéma relationnel expliqué ci-dessus est faux :
- Dans PARENT, il manque les attributs des petits-enfants.
- 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
:
:
:
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.
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
:
:
:
Par contre, le diagramme relationnel est déconnecté.
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.