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 :
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.
Single table inheritance
Le MCD suivant présente un héritage en cascade avec absorption dans la table-mère :
Le schéma relationnel expliqué ci-dessus est faux :
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é :
Ci-dessus, il faudrait
PARENT
au lieu deCHILD 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 :
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.
Par contre, le diagramme relationnel est déconnecté.
Est-ce le comportement attendu ? À vérifier.
Discussion
relations.py
.