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

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

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

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

enter image description here

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

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

Пока что я вижу два варианта:

Вариант 1:

Option 1

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

Нравится:

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

Неприязнь:

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

Вариант 2:

Option 2

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

Типа:

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

Неприязнь:

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

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

13
задан Community 23 May 2017 в 11:47
поделиться