Полиморфные ассоциации (PA) - это довольно непросто для относительно простого требования к базе данных: позволить различным таблицам иметь дочерние записи в одной общей таблице. Классический пример - это одна таблица с записями комментариев, которые относятся к разным, не обязательно родственным сущностям.
В этот вопрос Марк проделал отличную работу, показав три общих подхода к реализации PA. Я хочу использовать подход с использованием базовой таблицы, который более подробно описан в столь же прекрасном ответе Билла Карвина .
Конкретный пример может выглядеть следующим образом:
Первичные ключи объектов относятся к идентичным значениям ключей в базовой таблице, а таблица комментариев относится к базовой таблице, поэтому ссылочная целостность сохраняется. Важнейшей частью здесь является то, что первичные ключи таблиц сущностей имеют отдельных доменов.Они создаются путем создания новой записи в базовой таблице и копирования сгенерированного ключа в первичный ключ объекта.
Теперь мой вопрос: что, если я хочу ввести PA с ссылочной целостностью в существующую базу данных, имеющую сущности, которые генерируют свои собственные, взаимно перекрывающиеся первичные ключи?
Пока что я вижу два варианта:
Вариант 1:
Каждая сущность хранит свой собственный первичный ключ, но также получает альтернативный ключ.
Нравится:
Неприязнь:
Вариант 2:
Каждый объект имеет свой собственный столбец внешнего ключа в базовой таблице. Это похоже на подход Марка с несколькими столбцами.
Типа:
Неприязнь:
Я склоняюсь к варианту 1, возможно, с полем «EntityName» в базовой таблице для двунаправленной Погляди. Какой вариант лучше. Или есть другой, даже лучший подход?