Как смоделировать конкретную табличную связь, где дочерняя сущность может содержать разные данные, где данные принадлежат одному и тому же универсальному типу?

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

Мой вариант использования

У меня есть объект формы HTML, где форма в основном одинакова для многих вещей, то есть это большая форма, идентичная для разных продуктов, кроме product_options, которые отличаются в зависимости от точного product_type, Я хочу сохранить данные формы в таблицы, для хранения / поиска. Я думаю, что я хочу использовать реализацию Бетонной таблицы, и мне нужна обратная связь, если это способ сделать это.

Вот что я думаю:

введите описание изображения здесь

Скажем, если я хочу получить информацию для продукта типа "А", я

  1. Прочитать selection_for, получить product_type
  2. На основе 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 из моих рук.

Теперь, чтобы принять решение о том, какой из них использовать....