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