Ограничение внешнего ключа, указывающее на одну из нескольких таблиц - PullRequest
4 голосов
/ 22 августа 2010

У меня есть таблица с одним столбцом source_id, значение которой должно быть первичным ключом другой таблицы, хотя , таблица которой , будет варьироваться от записи к записи. Каждая запись должна иметь значение для source_table, которое определяет таблицу для исходной записи, и значение для source_id, которое указывает строку в исходной таблице.

Есть ли способ сделать это, чтобы воспользоваться ограничениями и проверкой внешнего ключа БД? Или мне придется перенести мою логику проверки на прикладной уровень? С другой стороны, есть ли другой дизайн, который позволит мне избежать этой проблемы?

Ответы [ 2 ]

4 голосов
/ 22 августа 2010

Ограничения внешнего ключа могут ссылаться только на одну целевую таблицу. «Условные» внешние ключи, которые ссылаются на другую целевую таблицу на основе какого-либо другого поля, недоступны в SQL. Как отмечено в комментарии ниже @ OMG Ponies , в одном столбце может быть несколько внешних ключей, ссылающихся на несколько таблиц, но это означает, что значение этого столбца должно существовать во всех ссылочные таблицы. Я думаю, что это не то, что вы после.

Для нескольких возможных решений, я предлагаю проверить @ ответ Билла Карвина на этот вопрос:

Мне нравится "супертабильный" подход в целом. Вы также можете проверить этот пост для другого примера:

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

Я думаю, что предыдущие ответы хорошо отвечают на первую часть вопроса.Однако ссылка, рекомендованная Дэниелом, обеспечивает решение только для случая, когда количество ссылочных «исходных» таблиц достаточно мало.И решение не будет легко масштабироваться, если вы решите увеличить количество «исходных» таблиц.

Чтобы порекомендовать лучшую стратегию, было бы неплохо иметь немного больше информации о том, что задача и если "Исходные "таблицы имеют что-то общее, что позволило бы объединить их.

В текущей структуре (насколько я могу судить по вопросу) я бы изменил соотношение:

  1. Iсоздаст таблицу (назовем ее AllSources), которая будет работать как хранилище всех доступных источников со столбцами source_id и source_table.Оба включаются в первичный ключ.
  2. Я бы создал внешние ключи из каждой таблицы «исходников», ссылающейся на таблицу AllSources, чтобы в них могли быть только зарегистрированные источники.
  3. Затем я бы создалтаблица, которую вы упомянули в своем вопросе с внешним ключом, ссылающимся на таблицу AllSources (не отдельные таблицы «источника»).

Недостаток: вам придется совместно управлять AllSources и «исходными» таблицами, гарантируя, что при создании записи в AllSources вы также создадите соответствующую запись в соответствующей «исходной» таблице, которая на самом делене так сложно.

...