ER наследование моделирования - PullRequest
2 голосов
/ 10 августа 2010

Ферма снабжения может иметь транспортный документ.При наличии он может быть одного из двух типов: внутренний или внешний.Оба документа имеют общие данные, но имеют разные специализированные поля.

Я хотел бы смоделировать это в режиме OO-ish следующим образом: alt text http://www.arsmaior.com/tmp/mod1.png

В таблице документов один из двух идентификаторов документа doc _ * _ равен нулю, другойвнешний ключ с соответствующей таблицей.

Это противоположно другой схеме, где общие данные избыточны: альтернативный текст http://www.arsmaior.com/tmp/mod2.png

Я пытаюсь выяснить плюсы и минусы обоих подходов.

КакЯ ВЫБИРАЮ, чтобы знать все внутренние документы в обоих случаях?У нас есть своего рода взаимоисключающие внешние ключи, соединения не так тривиальны.

Первый подход совершенно бесполезен?

Ответы [ 3 ]

1 голос
/ 10 августа 2010

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

В терминах реляционного моделирования существует третий способ моделирования наследования.То есть использовать тот же идентификатор для специализированных таблиц, что и для обобщенной таблицы.Тогда поле идентификатора таблицы doc_internal является как первичным ключом для таблицы doc_internal, так и внешним ключом, ссылающимся на таблицу supply_farm.То же самое для таблицы doc_external.

Поле идентификатора в таблице supply_farm является как первичным ключом таблицы supply_farm, так и внешним ключом, который ссылается на таблицу doc_internal или doc_external, в зависимости.Соединения волшебным образом собирают правильные данные.

Требуется небольшое программирование, чтобы настроить это, но оно того стоит.

Для более подробной информации, я предлагаю вам Google "Обобщение реляционного моделирования специализации обобщения",В Интернете есть несколько отличных статей на эту тему.

1 голос
/ 10 августа 2010

Оба подхода верны, и их использование будет полностью зависеть от вариантов использования, типа и объема данных, которые вы хотите сохранить, и типа запросов, которые вы хотите в основном запускать.Вы также можете подумать о комбинировании этих двух стратегий, когда иерархии наследования являются сложными.

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

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

0 голосов
/ 10 августа 2010

Если я правильно понял, то ферма ресурсов соответствует либо 0, либо 1 документам, которые всегда являются внутренним или внешним документом (никогда не обоими).один стол, вот так:

**SUPPLY_FARM_DOC**
ID Int (PK)
DOC_ID Int
INTERNAL_FLAG Boolean
DESCRIPTION Varchar(40)
SOME_DATA Varchar(40)
OTHER_DATA Varchar(40)
etc.
...