web-dev-qa-db-fra.com

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

Dites que j'ai une entité nommée logicielle 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 de code source, etc.

Donc, si je veux modéliser une autre entité, un système d'exploitation, comment dois-je le faire? Il y a une relation "est une relation" avec des logiciels, mais une relation "soit/ou" relation à freesoftware and nonfreesoftware.

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

12
jl6

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 la 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 doivent s'appliquer qu'à ces sous-types, mais il se peut que certains sous-types soient mutuellement exclusifs et certains ne le sont pas.

Si vous avez des sous-types mutuellement exclusifs, vous pouvez utiliser un attribut de partitionnement sur le super-type pour indiquer lequel des sous-types (deux ou plus) mutuellement exclusifs s'appliquent. 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 sont pas mutuellement exclusifs, ils peuvent exister sans utiliser d'attribut de partitionnement.

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

ERD

Vous avez trois super-types, mais le FREE_SOFTWARE et NON-FREE_SOFTWARE types sont mutuellement exclusifs, basés sur le SOFTWARE.free_not_free Attribut de partitionnement du drapeau. Tout type de logiciel donné est également potentiellement un OPERATING_SYSTEM, quels que soient, que ce soit ou non, c'est gratuit.

8
Joel Brown

Pourquoi le système d'exploitation sera-t-il une entité complètement nouvelle? Il devrait tomber sous le logiciel un, comme c'est ce que c'est. Et un système d'exploitation (si la source fermée) aurait une date d'achat, un fournisseur, etc. et Open-Source OS aurait une licence, une URL de code source, etc.

Je recommanderais une relation avec un SoftwareType ou quelque chose le long de ces lignes. C'est à ce moment-là que vous pourriez/devrait spécifier si le logiciel est un système d'exploitation ou une application, ou quels que soient les autres types de logiciels que vous prenez en charge.

1
Thomas Stringer