Как обработать отношение «ИЛИ» в дизайне ERD (таблицы)? - PullRequest
5 голосов
/ 20 января 2010

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

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

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

Какой способ решения этой проблемы более элегантен?

Ответы [ 2 ]

10 голосов
/ 20 января 2010

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

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

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

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

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

1 голос
/ 20 января 2010

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

...