2

J'essaie de créer une relation parent/enfant correcte dans mon modèle de données. J'ai une relation type un à plusieurs entre le parent et les enfants.Modélisation des données: relation 'dual' parent-enfant

Je me demande si j'ai des parents qui savent au sujet de leurs enfants, est-il

  1. jamais acceptable, et
  2. une bonne idée

pour chaque enfant de connaître précisément sur son parent ? (Un enfant ne peut avoir un parent dans mon cas)

parent  
------------- 
PARENT_ID 
OTHER_COL 
... 

child 
------------- 
CHILD_ID 
PARENT_ID // <-- Should this column be here? 
OTHER_COL 
... 

parent_has_children 
-------------------- 
PARENT_ID 
CHILD_ID 

L'avantage que je vois pour avoir la colonne mère chez l'enfant, est de récupérer facilement le parent d'un enfant. Mais, est-ce juste un design paresseux?

Merci d'avance.

Répondre

3

Modélisation de la 1-à-plusieurs

Si la relation est 1 parent à de nombreux enfants (le même enfant ne peut appartenir à un seul parent), l'approche standard de modélisation consiste à faire référence Table parent de la table enfant, via (l'une des) colonnes de la clé du parent, généralement la clé primaire du parent (PK). En même temps, il est aussi une bonne idée de contrainte de clé étrangère (FK) sur la colonne de référence (child.PARENT_ID) pour encourager les SGBDR à appliquer referential integrity à travers la relation:

parent  
------------- 
PARENT_ID PRIMARY KEY, // PK for the parent table 
OTHER_COL 
... 

child 
------------- 
CHILD_ID PRIMARY KEY, // PK for the Child Table 
PARENT_ID    // <-- Should this column be here? = Yes 
CONSTRAINT FK_ChildParent FOREIGN KEY(PARENT_ID) REFERENCES parent(PARENT_ID) 

Le nombre supplémentaire: table n parent_has_children est redondant, car il aura exactement une ligne par child, et il deviendra bientôt un fardeau de garder cette table en synchronisation avec les lignes ajoutées/supprimées des autres tables (comme l'échec de garder cette synchronisation entraînera une confusion/contradiction dans le l'intégrité de la relation).

Re: Comment les parents connaissent-ils leurs enfants?

dossiers d'enfants pour un parent donné peuvent être trouvés à l'aide d'une simple requête sur la table d'enfant filtrée sur la colonne de clé étrangère mère:

SELECT ... 
FROM child 
WHERE PARENT_ID = myParentId; 

Comme cela est généralement une requête commune, il est toujours une bonne L'idée est de s'assurer que la clé étrangère child.PARENT_ID est indexée - certaines versions du SGBDR le font pour toutes les clés étrangères par défaut.

CREATE INDEX IXFoo on child(PARENT_ID); 

Si vous avez un modèle d'entité (par ex.pour un ORM) dans une application représentant ces tables, l'entité parente aura généralement une collection contenant ses instances child, et sur l'entité enfant, la clé étrangère scalaire child.PARENT_ID 'column' est soit complètement supprimée, soit remplacée par une référence à un par exemple du parent:

class Parent 
{ 
    ParentId, 
    Child[] Children, 
    // ... 
} 

class Child 
{ 
    ChildId, 
    Parent Parent, // Optional, allows bidirectional navigation 
    // ... 
} 
1

Si la relation est vraiment un-à-plusieurs et pas beaucoup-à-plusieurs, alors laissez PARENT_ID sur la table CHILD comme clé étrangère et supprimez la table PARENT_HAS_CHILDREN complètement.

0

je aurais tendance à la table parent_has_children la casse et ont plutôt juste un PARENT_ID sur un enfant - c'est la façon plus conventionnelle de représenter ces données.

Questions connexes