2014-11-22 2 views
1

Я хочу, чтобы реализовать общую таблицу сказать, данные с колонной типа и foreign_id. foreign_id является иностранным ключом к другой таблице в зависимости от типа.Doctrine ORM связь внешнего ключа к нескольким таблицам

С доктриной ORM, я понимаю, что вам нужно заранее указать отношения отображения. Однако с foreign_id может ссылаться на разные таблицы в зависимости от типа . Как вы реализуете такие отношения, используя ORM?

В настоящее время я получаю вокруг вопроса путем создания нескольких таблиц, скажем info_a, info_b с a_id и b_id. Если количество типов увеличивается, это приведет к множеству таблиц, которые имеют по существу сходные структуры.

Как вы решаете это с помощью ORM? Заранее спасибо.

+2

Имея внешний ключ, сопоставленный с несколькими таблицами, представляет собой анти-шаблон в дизайне базы данных. См. [Здесь] (http://stackoverflow.com/questions/22177776/foreign-key-column-mapped-to-multiple-primary-keys/22179608#22179608). –

ответ

2

Вы «Решимость» это, принимая тот факт, что вы будет несколько таблиц «с аналогичными структурами».

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

Таким образом, решение о том, какое количество таблиц должно иметься, должно управляться в первую очередь тем значением, которое они представляют для пользователя, с различными типами значений, приводящими к отдельным таблицам. Привычка наблюдать, что две таблицы «имеют одну и ту же структуру» и поэтому должна быть объединена в одну, широко распространена, но тем не менее это серьезная ошибка.

Сделайте себе одолжение и узнайте/примите рефлекс, что «общие таблицы» BAD.

+0

Спасибо за ваш ответ. Я думаю, что хорошо держать ваш код сухим. Не должно ли это относиться и к структуре базы данных? –

+0

№ Структура базы данных не является кодом. См. Http://www.quora.com/How-would-you-explain-the-relational-database-model/answer/Jan-Hidders?share=1. «Структура» таблицы - это «множество отверстий», упомянутых в ней. Но вы можете иметь несколько различных предикатов (= несколько различных внешних значений) с точно таким же «набором отверстий». –

0

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

Вместо того, чтобы иметь тип столбцов и foreign_id [sic] в информации о таблице, где значение типа указывает, какая другая таблица должна отображаться в качестве значения id, просто иметь таблицу VALUE_info для каждого значения, разрешенного по типу с FK foreign_id в соответствующий идентификатор таблицы VALUE_other.

Однако возможно, что вам действительно нужна каждая таблица VALUE_other, чтобы ее столбец foreign_id являлся справочной информацией FK. Т.е. вы можете хотеть, чтобы FK шел другим путем. Это происходит, когда информация (id, type, ...) означает, что «вещь [id] имеет тип подтипа [type] и ...) и VALUE_other (foreign_id, ...) означает, что вещь [foreign_id] имеет подтип VALUE и ... «Обратите внимание, что именами имен являются then_info (id, type, ...) и VALUE_thing_info (id, ...). Возможно, вам больше не понадобится тип. Все, что похоже на это, может быть настроено автоматически ORM, который имеет явную поддержку «подтипирования» или «полиморфизма».

Если это соответствует вашим потребностям, то в этом конкретном случае подтипирования, поскольку вы могли иметь каждую строку информации с foreign_id FK в одну таблицу VALUE_other, это означает, что каждая вещь имеет только один подтип. Для не более одного подтипа вы можете написать ограничение SQL для каждой таблицы VALUE_thing_info, что совпадающая строка id в thing_info имеет значение типа VALUE. (Технический тип по-прежнему избыточен в базе данных, но он может помочь с ясностью и эффективностью.) Вы можете написать ограничение SQL, в котором значения идентификатора thing_info находятся в объединении значений идентификатора VALUE_thing_info. (Некоторые из таких ограничений могут быть декларативными.Следующий тип в thing_info помогает с этим. Ввод типа также в таблицах VALUE_thing_info является еще одним избыточным идиомом, который, однако, также может быть более декларативным. Хотя ограничения на обновления могут быть более быстрыми.)