laowantong / mocodo

Modélisation Conceptuelle de Données. Nickel. Ni souris.
https://www.mocodo.net
MIT License
181 stars 49 forks source link

Problèmes avec l'héritage en cascade #120

Open laowantong opened 2 weeks ago

laowantong commented 2 weeks ago

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