Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
laowantong opened this issue Oct 16, 2024 · 0 comments
Open

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

laowantong opened this issue Oct 16, 2024 · 0 comments
Labels

Comments

@laowantong
Copy link
Owner

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 :

def may_retrieve_distant_outer_source(self, leg, attribute):
if leg.entity_bid in self.inheritance_parent_or_children_to_delete:
for d in self.relations[leg.entity_bid]["columns"]:
if d["attribute"] == attribute["attribute"] and d["adjacent_source"] == attribute["adjacent_source"]:
return d["outer_source"]
return leg.entity.name_view


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 Bug héritage + entité faible #118.
@laowantong laowantong added the bug label Oct 16, 2024
laowantong added a commit that referenced this issue Oct 17, 2024
Fix #118
Je fusionne une version qui a l'air de fonctionner avec les trois principaux types d'héritage, pourvu qu'ils ne soient pas en cascade. Ce dernier cas ne marche pas, et fait l'objet d'une issue séparée : #120.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant