Как обработать “ИЛИ” отношения в ERD (таблица) дизайн?

Я разрабатываю маленькую базу данных для персонального проекта и одну из таблиц, называю ее таблицей C, потребности иметь внешний ключ к одной из двух таблиц, назовите их A и B, отличие записью. Что лучший способ состоит в том, чтобы реализовать это?

Идеи до сих пор:

  • Составьте таблицу с двумя nullable полями внешнего ключа, соединяющимися с этими двумя таблицами.
    • Возможно с триггером для отклонения вставляет и обновления, которые закончились бы 0 или 2 из них являющийся пустым.
  • Две отдельных таблицы с идентичными данными
    • Это нарушает правило о дублировании данных.

Что такое более изящный способ решить эту проблему?

5
задан Bill Karwin 20 January 2010 в 01:25
поделиться

2 ответа

Вы описываете дизайн, называемый полиморфными ассоциациями. Это часто заставляет людей в беду.

Что я обычно рекомендую:

A  -->  D  <--  B
        ^
        |
        C

В этом дизайне вы создаете общий родительский стол D , что оба A и B . Это аналогично общему супертипю в дизайне OO. Теперь ваш детский стол C может ссылаться на супер-таблицу и оттуда вы можете добраться до соответствующего подплета.

С помощью ограничений и сложных клавиш вы можете убедиться, что данный строк в D может быть навязчив только A или B , но не оба.

10
ответ дан 13 December 2019 в 19:27
поделиться

Если вы уверены, что C C когда-либо будет ссылаться только на одну из двух таблиц (и не одного из N), то ваш первый выбор - это разумный подход (и он использовал до). Но если вы думаете, что количество внешних ключевых столбцов собирается продолжать увеличиваться, это говорит о том, что есть некоторое сходство или перекрытие, которое может быть включено, и вы можете пересмотреть.

1
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: