J'essaie de comprendre comment représenter une relation unique à une (1: 1) concernant un Superclass/Sous-classe ou Supertype-Subtype Structure dans un diagramme de relation d'entité (ERD) du type créé à l'aide de MySQL Workbench (Comme vous le savez, semble plus proche d'une implémentation de SQL concrete qu'un diagramme original de PP Chen).
Je suis nouveau à cela, alors je ne suis pas sûr que je dois taper tous les attributs1 à nouveau dans les entités de sous-classe (ou sous-types ), c'est-à-dire MANAGER
et DRIVER
, ou si j'y ai est un moyen de connecter et saisir les attributs de la superclasse (ou Superype ) de sorte qu'il est plus clair qu'ils concernent, quelque chose comme une clé étrangère, je suppose.
1. Chaque attribut dans EMPLOYEE
s'applique à MANAGER
et DRIVER
, mais MANAGER
et DRIVER
_ aura du attributs qui ne sont pas des caractéristiques du type d'entité EMPLOYEE
(ou tableau, une fois qu'il est implémenté).
Bellow est l'ERD que j'ai créé jusqu'à présent:
Alors, comment puis-je représenter avec précision ce genre de relation dans mon diagramme?
C'est un cas de ce qu'on appelle "généralisation/spécialisation" dans le lingo. C'est vraiment la même chose que quels modèles d'objets appellent "Superclass/Sous-classe" comme vous l'avez fait. Il y a deux problèmes séparables. Le premier est comment voulez-vous dessiner le diagramme et le second est comment voulez-vous concevoir les tables?.
En ce qui concerne le dessin du diagramme, je dessinerais de la même manière que vous avez, à une exception près. Les lignes menant à la sortie des gestionnaires et des chauffeurs ne seront pas séparément aux employés. Au lieu de cela, ils iraient à quelque chose que j'appellerai une boîte Gen/Spec. Le suivant échantillon montre un moyen de décrire une affaire GEN/SPEC. Ensuite, une seule ligne relie la boîte GEN/SPEC avec la table des employés. Tout dépend de quelle manière semble plus simple et plus claire pour vous et pour les autres qui regardent le diagramme.
En ce qui concerne les tables, vous pourriez avoir trois tables, comme vous l'avez montré. Ceci est parfois appelé "héritage de la table de classe". Il y a une technique que vous pourriez bénéficier de "clé primaire partagée". Dans cette technique, la table du gestionnaire et la table de conducteur n'ont pas de champ d'identification à part. Au lieu de cela, il y a une copie de l'employé_id dans chaque table de sous-classe et que l'employé_id est déclaré à la fois la principale clé de ce tableau et également une clé étrangère qui fait référence aux employés.
L'utilisation de la clé principale partagée vous achète quelques choses et cela vous coûte quelque chose.
Il achète votre application de la limite de 1: 1 sur le responsable-employé ou le conducteur-employé. Cela peut finir par accélérer les jointures résultantes. Et il permet à une quatrième table qui utilise un identifiant d'employé comme une clé étrangère à relever directement sur les pilotes ou les gestionnaires. Les employés non pertinents abandonnent la jointure.
Ce qu'il en coûte est que vous devez obtenir et utiliser une copie du bon employé_id chaque fois que vous allez insérer un pilote ou un gestionnaire.
Vous pouvez également simplement emballer des attributs de pilote et des attributs manager dans la table des employés, laissant des champs non pertinents null. Cela entraîne moins de jointures, mais cela a un inconvénient. Il rend la table des employés légèrement plus gros et plus lente. Et si vous utilisez des champs nullables dans les clauses, vous devrez apprendre comment SQL effectue trois logiques valorisées (vraies, fausses et inconnues). Pour certaines personnes, ceci est terriblement difficile à saisir. J'essaie d'éviter trois logiques valorisées moi-même.