Как мне смоделировать отношения «или / или»?

12

Скажем, у меня есть объект с именем Software и два подтипа FreeSoftware и NonFreeSoftware. Сущность NonFreeSoftware имеет такие атрибуты, как дата покупки, поставщик и т. Д. Сущность FreeSoftware имеет такие атрибуты, как лицензия, URL исходного кода и т. Д.

Так что, если я хочу смоделировать другую сущность, OperatingSystem, как мне это сделать? Существует отношение «есть» к программному обеспечению, но есть отношение «или / или» к FreeSoftware и NonFreeSoftware.

Я думаю, что что-то упущено в том, как я анализирую эту иерархию.

jl6
источник
Просмотрите этот ответ . Он охватывает детали реализации моделирования такого рода отношений.
Ник Чаммас

Ответы:

8

Способ управлять этим состоит в том, что ваши подтипы должны определяться супертипом (т.е. PK подтипа также является FK от подтипа до супертипа.)

Задача состоит в том, чтобы понять, является ли что-то действительно взаимоисключающим или нет. Атрибуты подтипов должны применяться только к этим подтипам, но вполне может быть, что некоторые подтипы являются взаимоисключающими, а некоторые - нет.

Если у вас есть несколько взаимоисключающих подтипов, то вы можете использовать атрибут разделения в супертипе, чтобы указать, какой из (двух или более) применяются взаимоисключающие подтипы. Этот атрибут разделения может использоваться с ограничениями или триггерами для обеспечения взаимной исключительности.

Если у вас есть подтипы, которые не являются взаимоисключающими, они могут существовать без использования каких-либо атрибутов разделения.

Рассмотрим эту модель данных:

ERD

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

Джоэл Браун
источник
1
Немного ОТ: что вы использовали, чтобы сделать эту диаграмму ER?
Даниэль Серодио
@DanielSerodio - я использовал Visio с умными формами, которые я создал сам на основе нотации James Martin ERD. Фигуры используют собственную текстуру линий, чтобы придать им неформальный вид, который я нахожу полезным, напоминая людям, когда диаграмма представляет собой «эскиз» или черновой дизайн.
Джоэл Браун
@JoelBrown Хотели бы вы поделиться своими трафаретами? Это действительно хорошие формы
imoatama
2
@imoatama - Прошло некоторое время, но я наконец-то нашел время опубликовать трафарет здесь: moosewarevisioerd.codeplex.com Обратите внимание, как и в описании, что умные формы трафарета были созданы для более старой версии Visio и некоторые из поведений Форма соединителя может быть немного ненадежной. Однажды я найду время, чтобы исправить это.
Джоэл Браун
1

Почему OperatingSystem была бы совершенно новой сущностью? Он должен подпадать под программный, так как он есть. И ОС (если она с закрытым исходным кодом) будет иметь дату покупки, поставщика и т. Д. И ОС с открытым исходным кодом будет иметь лицензию, URL исходного кода и т. Д.

Я бы порекомендовал отношения к SoftwareTypeили что-то в этом роде. Именно тогда вы могли / должны указать, является ли Программное обеспечение операционной системой, или приложением, или любым другим типом программного обеспечения, которое вы поддерживаете.

Томас Стрингер
источник
Я хотел бы, чтобы OperatingSystem была отдельной сущностью, поскольку это специализация программного обеспечения. Он может иметь атрибуты, которые не будут иметь другие программы (такие как тип ядра, флаг RTOS или нет, флаг многопользовательского режима и т. Д.).
jl6
1
@ jl6 Я все же позволю себе не согласиться. Каждое программное обеспечение (будь то ОС или нет) будет иметь определенные атрибуты. Они могут храниться в другом месте. Вы минимизируете масштабируемость, сохраняя ОС отдельно.
Томас Стрингер
Если я правильно понимаю, вы рекомендуете объект Software и объект SoftwareType. Вы говорите, что Free, NonFree и OperatingSystem - это просто разные экземпляры SoftwareType? Я уверен, что вы правы, но тогда где вы храните различные атрибуты разных типов?
jl6