Как смоделировать конкретную табличную связь, где дочерняя сущность может содержать разные данные, где данные принадлежат одному и тому же универсальному типу?
Я подумываю об использовании наследования конкретных таблиц для варианта использования, и мне нужна помощь, чтобы определить, нужно ли мне использовать идентификацию по отношению к неидентифицирующим отношениям, а также, как правильно структурировать мои таблицы.
Мой вариант использования
У меня есть объект формы HTML, где форма в основном одинакова для многих вещей, то есть это большая форма, идентичная для разных продуктов, кроме product_options
, которые отличаются в зависимости от точного product_type
, Я хочу сохранить данные формы в таблицы, для хранения / поиска. Я думаю, что я хочу использовать реализацию Бетонной таблицы, и мне нужна обратная связь, если это способ сделать это.
Вот что я думаю:
Скажем, если я хочу получить информацию для продукта типа "А", я
- Прочитать selection_for, получить
product_type
- На основе
product_type
Я прочитал соответствующую таблицу опций
Это кажется немного сложным...
Я также использую Doctrine ORM для управления базой данных за кулисами, поэтому такие манипуляции с данными могут оказаться трудными для реализации через ORM API, но я сначала хотел рассмотреть этот вариант.
Вопросы:
- Будет ли мой дизайн работать как есть? Можно ли это улучшить? Правильно ли я реализовал дизайн бетонного стола?
- Используются ли идентифицирующие или неидентифицирующие отношения для таблиц опций продукта?
Я также могу сделать альтернативную схему следующим образом:
и если один из этих внешних ключей не равен NULL, тогда я читаю этот ключ, а затем читаю соответствующую таблицу для извлечения данных.
Вопросы:
Есть ли плюсы или минусы этого второго метода по сравнению с первым?
1 ответ
Оказывается, Доктрина ORM имеет это обработано. 3 разных способа:
Сопоставленный суперкласс
Создает 3 таблицы в моем случае, каждая имеет как общие, так и конкретные поля / столбцы
Наследование в одной таблице
Объединяет все параметры в одну таблицу (одна таблица, другие таблицы не используются). Использует discriminator
поле, чтобы вытащить правильные варианты.
Наследование таблицы классов
ака JOINED
тип. Создает 4 таблицы в моем случае, по одной для каждого типа, плюс основная. Таблицы параметров содержат только относящиеся к ним параметры, а основная таблица содержит все общие поля, а discriminator
поле.
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html
Я думаю, именно то, что я искал. Это забирает работу SQL из моих рук.
Теперь, чтобы принять решение о том, какой из них использовать....