Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelle est la table enfant dans une relation d'identification ou de non-identification ?

Une table enfant (A.K.A. entité faible ) est une table dont les attributs de clé primaire dépendent sur une autre table, donc la table enfant est identifiée ou partiellement identifié par lignes dans la table dont il dépend (parent). Les lignes d'une table enfant ne peuvent pas exister sans une ligne correspondante dans sa table parent.

Pour illustrer cela, prenons un exemple simple et tout à fait pertinent que nous connaissons tous :Parents et enfants dans le contexte de la famille . Nous pouvons modéliser cette relation avec des tables comme suit :

Dans le modèle ci-dessus, chaque ligne du Parents la table est identifiée de manière unique par un SSN . Le SSN est un attribut intrinsèque et unique à chaque parent, c'est donc une entité autonome ou "forte" car elle ne s'appuie pas sur une autre table pour définir son identité.

Cependant, les enfants exigent un parent pour exister (Parent_SSN doit référence à un SSN existant dans les Parents table).

Notez la clé primaire composite (Parent_SSN, Name ) dans les Children table. Cela signifie que les enfants sont identifiés de manière unique par la combinaison de Parent_SSN et Name . Vous ne pouvez pas interroger un enfant individuel en vous basant uniquement sur le Name car plusieurs parents peuvent avoir des enfants portant le même nom. De même, vous ne pouvez pas interroger un enfant individuel en vous basant uniquement sur le Parent_SSN car un parent peut avoir plusieurs enfants. Compte tenu de cela, les enfants sont partiellement identifiés par leur parent, donc identifiant relation.

Mais les enfants ne peuvent-ils pas également être identifiés de manière unique par un SSN ? Pourquoi oui, certainement. Allons-y et ajustons notre modèle pour inclure cela :

Dans cette version du modèle, notez que nous avons introduit le SSN champ pour Children . L'identité unique des enfants est désormais défini par leur propre SSN intrinsèque et unique . Leur identité ne dépend plus sur les Parents table. Bien que le Parent_SSN le champ fait toujours référence au SSN des Parents table, il n'a aucune part dans l'identité unique de l'enfant, les parents ont donc un non identifiant relation avec leurs enfants, et les deux tables peuvent désormais être considérées comme des entités autonomes "fortes".

Soit dit en passant, cette version du modèle présente quelques avantages par rapport à la première :

Dans les deux modèles ci-dessus, les Parents table est considérée comme la table parente des Children table. Cependant, en non identifiant relations comme dans le deuxième modèle, Parents n'est qu'une table parent dans le contexte de la clé étrangère Parent_SSN parce que Parent_SSN références/dépend sur SSN dans les Parents table, mais ne le fait pas participer à la définition de l'identité réelle des enfants.

Pour illustrer pourquoi le contexte est important lorsqu'il s'agit de décider quelles tables sont des tables parent/enfant, considérons l'exemple suivant impliquant une dépendance circulaire :

Dans cet exemple, les employés et les services sont identifiés de manière unique par leurs propres attributs et ne tirent aucune partie de leur identité d'autres tables.

Ici, nous avons deux relations non identifiantes :un employé travaille pour un service (DeptNo dans le Employee table), et un département est géré par un employé (ManagerSSN dans le Department table). Laquelle est la table parent ? ...Table enfant ?

Cela dépend du contexte — de quelle relation de clé étrangère parlez-vous ? La table Department serait considérée comme la table parent dans le contexte de DeptNo dans le Employee table car DeptNo est référençant/dépendant sur le Department table.

Cependant, la table Employee serait considérée comme la table parent dans le contexte de ManagerSSN dans le Department table car ManagerSSN est référençant/dépendant sur le Employee tableau.