38 votes

Comment implémenter une relation IS-A?

Nous mettons en œuvre un Un-à-Plusieurs relations par l'ajout d'un Tableau de PK, comme FK à l'autre Table. Nous mettons en œuvre Plusieurs-à-Plusieurs relations en ajoutant 2 de la Table de PKs pour une troisième Table.

Comment pouvons-nous mettre en œuvre une Relation " EST-UN ?

Les Entités sont des techniciens et des ADMINISTRATIFS qui sont des EMPLOYÉS. Je pourrais simplement utiliser un champ supplémentaire dans la Table EMPLOYÉ(id, nom, prénom, rôle, ...AdminFields..., ...TechFields...)

mais je voudrais explorer l'EST-UNE option.

EDIT: j'ai fait comme Donnie suggéré, mais sans le rôle de champ.

29voto

athspk Points 3073

J'ai fait comme Donnie l'a suggéré, mais sans le champ de rôle , car cela complique les choses. Ceci est la mise en œuvre finale:

DDL:

 CREATE TABLE Employee (
ast VARCHAR(20) not null,
firstname VARCHAR(200) not null,
surname VARCHAR(200) not null,
...
PRIMARY KEY(ast)
);

CREATE TABLE Administrative (
employee_ast VARCHAR(20) not null REFERENCES Employee(ast),
PRIMARY KEY(employee_ast)
);

CREATE TABLE Technical (
employee_ast VARCHAR(20) not null REFERENCES Employee(ast),
...
PRIMARY KEY(employee_ast)
);
 

Diagramme ER:

ERD

Dans ce modèle, il n'y a pas d'employés de type générique. Ici, un employé ne peut être que administratif ou technique.

8voto

Walter Mitty Points 8726

La relation " EST-UN est également connu comme le gen-spec modèle de conception. Gen-spec est l'abréviation de "généralisation spécialisation".

Relationnel modélisation de la gen-spec est différent de l'objet de la modélisation de la gen-spec parce que le modèle relationnel n'a pas l'héritage construit en.

Voici un bon article qui montre comment mettre en œuvre gen-spec comme une collection de tableaux.

http://www.javaguicodexample.com/erdrelationalmodelnotes1.html

Payer une attention particulière à la façon dont les clés primaires sont mis en place dans le des tables spécifiques. C'est ce qui rend l'utilisation de ces tables si facile.

Vous pouvez trouver beaucoup d'autres articles par googlin "généralisation spécialisation modélisation relationnelle".

7voto

Donnie Points 17312

J'ai toujours fait cela avec un champ role , puis des relations facultatives.

C'est-à-dire, table EMPLOYEE (id, ...generic fields... , role)

Et puis, pour chaque rôle:

table ROLE1 (employeeid, ...specific fields...)

Cela vous permet d'obtenir des informations générales sur les employés avec une seule requête et nécessite des jointures pour accéder aux informations spécifiques au rôle. Le seul inconvénient (gros) est que si vous avez besoin d'un super-rapport avec toutes les informations sur le rôle, vous êtes coincé avec un tas de jointures externes.

5voto

Don Roby Points 24965

Si vous avez un OO application dont vous aurez besoin pour vous connecter à un relationnel de la base de données principale, je vous recommande d'entrer Martin Fowler Modèles de l'Architecture des Applications d'Entreprise.

Il a aussi quelques notes pertinentes et des diagrammes sur son site web. Plus précisément, les modèles Unique de l'Héritage de Table, Table de Classe de Succession et de l'Héritage de Table Concret décrire trois tactiques pour la cartographie EST-A dans les tableaux de données.

Si vous êtes en utilisant Hibernate ou JPA, ils prennent en charge les mappages pour toutes ces, mais ils ont des noms différents pour eux.

Dans ce cas précis, je ne voudrais pas utiliser EST-UN à tous.

Des choses comme les rôles des employés sont mieux modélisés comme des A-A, comme

  1. Vous pourriez vouloir d'une seule personne ont des rôles multiples.
  2. La modification d'une personne son rôle sera de plus facile.

2voto

mattmc3 Points 6768

Pourquoi ne pas mettre en œuvre cette un-à-zéro/une table de relation? Disons que vous avez un tableau représentant une classe de base appelée Véhicule, avec une clé primaire de VehicleID. Ensuite, vous pouvez avoir n'importe quel nombre de satellites tableaux représentant toutes les sous-classes de Véhicule, et ces tables ont aussi VehicleID que leur clé primaire, ayant un 1->0/1 relation de Véhicule->sous-classe.

Ou, si vous voulez la rendre plus simple et vous savez que vous ne pourrez jamais avoir un peu de sous classes et il n'y a pas beaucoup de chance de ce changement, vous avez juste à représenter l'ensemble de la structure dans une seule table avec un régulateur de type de champ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X