Comment dois-je modéliser une relation «soit / ou»?

12

Disons que j'ai une entité nommée Software et deux sous-types FreeSoftware et NonFreeSoftware. L'entité NonFreeSoftware a des attributs tels que la date d'achat, le fournisseur, etc. L'entité FreeSoftware a des attributs tels que la licence, l'URL du code source, etc.

Donc, si je veux modéliser une autre entité, OperatingSystem, comment dois-je le faire? Il existe une relation "existe" avec le logiciel, mais une relation "soit / ou" avec FreeSoftware et NonFreeSoftware.

Je pense que je manque quelque chose dans la façon dont j'analyse cette hiérarchie.

jl6
la source
Passez en revue cette réponse . Il couvre les détails de mise en œuvre de la modélisation de ce type de relation.
Nick Chammas

Réponses:

8

La façon de gérer cela est que vos sous-types doivent être déterminés par le super-type (c'est-à-dire que le PK du sous-type est également un FK du sous-type au super-type.)

Le défi consiste à comprendre si quelque chose est vraiment mutuellement exclusif ou non. Les attributs des sous-types ne devraient s'appliquer qu'à ces sous-types, mais il se pourrait bien que certains sous-types s'excluent mutuellement et d'autres non.

Si vous avez des sous-types mutuellement exclusifs, vous pouvez utiliser un attribut de partitionnement sur le super-type pour indiquer lequel des (deux ou plusieurs) sous-types mutuellement exclusifs s'applique. Cet attribut de partitionnement peut être utilisé avec des contraintes ou des déclencheurs pour appliquer l'exclusivité mutuelle.

Si vous avez des sous-types qui ne s'excluent pas mutuellement, ils peuvent exister sans utiliser d'attribut de partitionnement.

Considérez ce modèle de données:

ERD

Vous avez trois super-types, mais les types FREE_SOFTWAREet NON-FREE_SOFTWAREsont mutuellement exclusifs, en fonction de l' SOFTWARE.free_not_freeattribut de partitionnement d'indicateur. Tout logiciel donné est également potentiellement un OPERATING_SYSTEM, qu'il soit gratuit ou non.

Joel Brown
la source
1
Légèrement OT: qu'avez-vous utilisé pour faire ce diagramme ER?
Daniel Serodio
@DanielSerodio - J'ai utilisé Visio avec des formes intelligentes que j'ai moi-même construites sur la base de la notation James Martin ERD. Les formes utilisent une texture de ligne personnalisée pour leur donner une apparence informelle, ce que je trouve utile pour rappeler aux gens quand un diagramme est un "croquis" ou une ébauche.
Joel Brown
@JoelBrown Seriez-vous prêt à partager vos pochoirs? Ce sont de très belles formes
imoatama
2
@imoatama - Cela fait longtemps, mais j'ai finalement pu publier le pochoir ici: moosewarevisioerd.codeplex.com Notez comme dans la description que les formes intelligentes du pochoir ont été construites pour une ancienne version de Visio et certains des comportements du les formes des connecteurs de relation peuvent être un peu floconneuses. Un jour, je vais régler ce problème.
Joel Brown
1

Pourquoi OperatingSystem serait-il une entité complètement nouvelle? Il devrait relever du logiciel, car c'est ce que c'est. Et un système d'exploitation (s'il est de source fermée) aurait une date d'achat, un fournisseur, etc. Et un système d'exploitation open-source aurait une licence, une URL de code source, etc.

Je recommanderais une relation à un SoftwareTypeou quelque chose du genre. C'est à ce moment-là que vous pourriez / devriez spécifier si le logiciel est un système d'exploitation, une application ou tout autre type de logiciel que vous prenez en charge.

Thomas Stringer
la source
Je voudrais que OperatingSystem soit une entité distincte car c'est une spécialisation de logiciel. Il peut avoir des attributs qu'aucun autre logiciel n'aura (tels que le type de noyau, l'indicateur RTOS ou non, l'indicateur multi-utilisateur, etc.).
jl6
1
@ jl6 Je vous prie toujours de différer ici. Chaque logiciel (qu'il s'agisse d'un système d'exploitation ou non) aura des attributs spécifiques. Ceux-ci peuvent être stockés ailleurs. Vous réduisez l'évolutivité en séparant le système d'exploitation.
Thomas Stringer
Si je comprends bien, vous recommandez une entité Software et une entité SoftwareType. Voulez-vous dire que Free, NonFree et OperatingSystem ne sont que des instances différentes de SoftwareType? Je suis sûr que vous avez raison, mais alors où stockez-vous les différents attributs des différents types?
jl6