Wie soll ich eine Entweder-Oder-Beziehung modellieren?

11

Angenommen, ich habe eine Entität namens Software und zwei Untertypen FreeSoftware und NonFreeSoftware. Die NonFreeSoftware-Entität verfügt über Attribute wie Kaufdatum, Anbieter usw. Die FreeSoftware-Entität verfügt über Attribute wie Lizenz, Quellcode-URL usw.

Wenn ich also eine andere Entität, OperatingSystem, modellieren möchte, wie soll ich das tun? Es gibt eine "ist eine" Beziehung zu Software, aber eine "entweder / oder" Beziehung zu FreeSoftware und NonFreeSoftware.

Ich glaube, ich vermisse etwas in der Art, wie ich diese Hierarchie analysiere.

jl6
quelle
Überprüfen Sie diese Antwort . Es behandelt die Implementierungsdetails der Modellierung dieser Art von Beziehung.
Nick Chammas

Antworten:

8

Um dies zu verwalten, müssen Ihre Untertypen vom Supertyp bestimmt werden (dh die PK des Untertyps ist auch eine FK vom Untertyp zum Supertyp.)

Die Herausforderung besteht darin zu verstehen, ob sich etwas wirklich gegenseitig ausschließt oder nicht. Die Attribute von Untertypen sollten nur für diese Untertypen gelten, aber es kann durchaus sein, dass sich einige Untertypen gegenseitig ausschließen und andere nicht.

Wenn Sie einige sich gegenseitig ausschließende Untertypen haben, können Sie ein Partitionierungsattribut für den Supertyp verwenden, um anzugeben, welcher der (zwei oder mehr) sich gegenseitig ausschließenden Untertypen gilt. Dieses Partitionierungsattribut kann mit Einschränkungen oder Auslösern verwendet werden, um die gegenseitige Ausschließlichkeit zu erzwingen.

Wenn Sie Untertypen haben, die sich nicht gegenseitig ausschließen, können diese ohne Verwendung eines Partitionierungsattributs vorhanden sein.

Betrachten Sie dieses Datenmodell:

ERD

Sie haben drei Supertypen, aber die Typen FREE_SOFTWAREund schließen NON-FREE_SOFTWAREsich gegenseitig aus, basierend auf dem SOFTWARE.free_not_freeFlag-Partitionierungsattribut. Jede gegebene Software ist möglicherweise auch eine OPERATING_SYSTEM, unabhängig davon, ob sie kostenlos ist oder nicht.

Joel Brown
quelle
1
Etwas OT: Womit haben Sie dieses ER-Diagramm erstellt?
Daniel Serodio
@DanielSerodio - Ich habe Visio mit intelligenten Formen verwendet, die ich selbst basierend auf der James Martin ERD-Notation erstellt habe. Die Formen verwenden eine benutzerdefinierte Linientextur, um ihnen ein informelles Erscheinungsbild zu verleihen. Dies ist hilfreich, um Menschen daran zu erinnern, wenn ein Diagramm eine "Skizze" oder ein Entwurfsentwurf ist.
Joel Brown
@JoelBrown Würdest du gerne deine Schablonen teilen? Das sind wirklich schöne Formen
imoatama
2
@imoatama - Es ist eine Weile her, aber ich bin endlich dazu gekommen, die Schablone hier zu veröffentlichen: moosewarevisioerd.codeplex.com Beachten Sie wie in der Beschreibung, dass die intelligenten Formen der Schablone für eine ältere Version von Visio und einige der Verhaltensweisen der Schablone erstellt wurden Beziehungsverbinderformen können ein bisschen flockig sein. Eines Tages werde ich mich darum kümmern, das zu beheben.
Joel Brown
1

Warum sollte OperatingSystem eine völlig neue Einheit sein? Es sollte unter die Software fallen, da es so ist. Und ein Betriebssystem (wenn Closed-Source) hätte ein Kaufdatum, einen Anbieter usw. Und ein Open-Source-Betriebssystem hätte eine Lizenz, eine Quellcode-URL usw.

Ich würde eine Beziehung zu einem SoftwareTypeoder etwas in dieser Richtung empfehlen . In diesem Fall können / sollten Sie angeben, ob es sich bei der Software um ein Betriebssystem oder eine Anwendung handelt oder welche anderen Arten von Software Sie unterstützen.

Thomas Stringer
quelle
Ich möchte, dass OperatingSystem eine separate Einheit ist, da es sich um eine Spezialisierung auf Software handelt. Es kann Attribute haben, die keine andere Software haben wird (wie Kerneltyp, RTOS-oder-nicht-Flag, Mehrbenutzer-Flag usw.).
16.
1
@ jl6 Ich möchte mich hier immer noch unterscheiden. Jede Software (ob Betriebssystem oder nicht) hat bestimmte Attribute. Diese können an anderer Stelle gespeichert werden. Sie minimieren die Skalierbarkeit, indem Sie das Betriebssystem getrennt halten.
Thomas Stringer
Wenn ich das richtig verstehe, empfehlen Sie eine Software-Entität und eine SoftwareType-Entität. Wollen Sie damit sagen, dass Free, NonFree und OperatingSystem nur unterschiedliche Instanzen von SoftwareType sind? Ich bin sicher, Sie haben Recht, aber wo speichern Sie dann die verschiedenen Attribute der verschiedenen Typen?
16.