Як я повинен моделювати відносини "або / або"?


12

Скажімо, у мене є сутність під назвою Програмне забезпечення та два підтипи FreeSoftware та NonFreeSoftware. Суб'єкт NonFreeSoftware має такі атрибути, як дата покупки, постачальник тощо. Суб'єкт FreeSoftware має такі атрибути, як ліцензія, URL-код вихідного коду тощо.

Отже, якщо я хочу моделювати іншу сутність, OperatingSystem, як мені це зробити? Існує "є" відносини до Програмного забезпечення, але "або / або" відносини до FreeSoftware та NonFreeSoftware.

Я думаю, що мені щось не вистачає в аналізі цієї ієрархії.


Перегляньте цю відповідь . Він охоплює деталі реалізації моделювання такого роду відносин.
Нік Чаммас

Відповіді:


8

Спосіб управління цим полягає в тому, що ваші підтипи повинні визначатися над типом (тобто ПК підтипу також є FK від підтипу до супертипу.)

Завдання полягає в розумінні того, чи є щось справді взаємовиключним чи ні. Атрибути підтипів повинні застосовуватися лише до тих підтипів, але, можливо, деякі підтипи взаємно виключають, а деякі - ні.

Якщо у вас є кілька взаємовиключних підтипів, ви можете використовувати атрибут розділення на супер-тип, щоб вказати, який із (двох або більше) взаємовиключних підтипів застосовується. Цей атрибут розділення може використовуватися з обмеженнями або тригерами для забезпечення взаємної ексклюзивності.

Якщо у вас є підтипи, які не є взаємовиключними, вони можуть існувати без використання атрибутів розділення.

Розглянемо цю модель даних:

ERD

У вас є три супер-типу, але FREE_SOFTWAREі NON-FREE_SOFTWAREтипи є взаємовиключними, на основі SOFTWARE.free_not_freeатрибута прапора поділу. Будь-який фрагмент програмного забезпечення також потенційно є OPERATING_SYSTEM, незалежно від того, вільний він чи ні.


1
Трохи OT: що ви використали для створення цієї діаграми ER?
Даніель Серодіо

@DanielSerodio - я використовував Visio із розумними формами, які створив на основі позначення ЕРД про Джеймса Мартіна. Фігури використовують спеціальні текстури ліній, щоб надати їм неофіційний вигляд, що мені здається корисним нагадати людям, коли діаграма є "ескізом" або дизайном проекту.
Джоел Браун

@JoelBrown Чи бажаєте ви поділитися своїми трафаретами? Це справді приємні форми
imoatama

2
@imoatama - Минуло багато часу, але я нарешті обійшов розміщення трафарету тут: moosewarevisioerd.codeplex.com Зауважте, як в описі, що розумні форми трафарету були побудовані для більш старої версії Visio та деяких способів поведінки Форми з'єднувачів відносин можуть бути трохи відшаровуються. Одного разу я обійдуся, щоб виправити це.
Джоел Браун

1

Чому OperatingSystem буде абсолютно новою сутністю? Він повинен підпадати під Програмне забезпечення, як саме воно є. І ОС (якщо закритий код) матиме дату придбання, постачальника тощо. А ОС з відкритим кодом матиме ліцензію, URL-адресу вихідного коду тощо.

Я б рекомендував стосунки до того SoftwareTypeчи іншого в цьому напрямку. Ось тоді ви могли / повинні вказати, чи програмне забезпечення є ОС, чи додатком, чи будь-яким іншим типом програмного забезпечення, яке ви підтримуєте.


Я хотів би, щоб OperatingSystem був окремим об'єктом, оскільки це спеціалізація програмного забезпечення. Він може мати атрибути, яких не матиме жодне інше програмне забезпечення (наприклад, тип ядра, прапор RTOS чи ні, прапор багатокористувача тощо).
jl6

1
@ jl6 Я все ж прошу тут відрізнятись. Кожна частина програмного забезпечення (будь то ОС чи ні) матиме конкретні атрибути. Їх можна зберігати в іншому місці. Ви мінімізуєте масштабованість, тримаючи ОС окремо.
Томас Стрінгер

Якщо я правильно розумію, ви рекомендуєте об'єкт програмного забезпечення та об'єкт SoftwareType. Ви говорите, що Free, NonFree та OperatingSystem - це лише різні екземпляри SoftwareType? Я впевнений, що ви правильні, але тоді, де ви зберігаєте різні атрибути різних типів?
jl6
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.