Подтвердить что ты не робот

Как реализовать полиморфные ассоциации в существующей базе данных

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

В этот вопрос Марк проделал отличную работу, продемонстрировав три общих подхода к внедрению ПА. Я хочу использовать подход базовой таблицы, который более подробно описан в столь же отличном ответе Билла Карвина.

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

enter image description here

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

Теперь мой вопрос: что, если я хочу представить PA с ссылочной целостностью в существующей базе данных, имеющей сущности, которые генерируют свои собственные взаимно перекрывающиеся первичные ключи?

До сих пор я вижу два варианта:

Вариант 1:

Option 1

Каждый объект сохраняет свой первичный ключ, но также получает альтернативный ключ.

Как

  • Близко к рекомендуемому подходу.
  • Базовая таблица стабильна.

Неприязнь:

  • Существующие объекты должны быть изменены.
  • Трудно найти владельца объекта комментария.

Вариант 2:

Option 2

Каждый объект имеет свой собственный столбец внешнего ключа в базовой таблице. Это похоже на подход с несколькими столбцами Mark.

Как

  • Существующие объекты не затронуты.
  • Легко найти принадлежащую владельцу комментарий.

Неприязнь:

  • Разреженные столбцы
  • Базовая таблица нестабильная: требуется модификация, когда вводится новый объект с PA.

Я наклоняюсь к опции 1, возможно, с полем "EntityName" в базовой таблице для двунаправленного поиска. Какой вариант будет лучше. Или другой, даже лучше, подход?

4b9b3361

Ответ 1

Вы можете использовать вариант 1, но без дополнительного альтернативного ключа суррогата.

Вместо этого продолжите существующий первичный ключ (каждого объекта) с столбцом EntityType (скажем CHAR(1), который будет E для событий, P для лиц, D для продуктов).

Соединение (EntityId, EntityType) станет тогда Первичным ключом таблицы Entity и соответствующими соединениями в других таблицах подтипа 3.

(EntityType является просто вспомогательной справочной таблицей с тремя строками):

Polymorphic_Associations