Да, есть способ сделать то, что вы хотите: сделать обе таблицы подтипами другой таблицы. Это означает синхронизировать их значения PK, чтобы значение PK одной таблицы было равно соответствующему значению PK в другой таблице. Например, если обе таблицы имеют отдельные столбцы identity
, их нужно будет заменить обычными столбцами, сгенерировать identity
в другом месте, а затем использовать то же значение, что и в обеих таблицах, когда две таблицы имеют один к одному отношения.
То есть, создайте супертип или "главную" таблицу, которая содержит значение PK, которое будет необязательно один раз в каждой из двух других таблиц. Сделайте ключевой столбец двух таблиц обе КЛАСТЕРНЫМ ПК этой таблицы, а также FK для основной таблицы, а не для таблицы других подтипов.
Проблема решена. Таблицы могут иметь как ноль, так и одну строку каждого значения.
В конечном счете, если генерация PK не основана на идентичности, и в таблице супертипов, кроме значения PK, нет данных, которые хранятся в таблице, то фактически таблица супертипа на самом деле не нужна, за исключением случая окончательной записи, что логическая сущность существует (она находится в таблице супертипов), но имеет нулевые строки в обеих таблицах подтипов. Если отсутствия значения достаточно, чтобы надежно указать, что обе таблицы подтипов имеют нулевые строки, и значение PK для двух таблиц может быть сгенерировано без столбца идентификаторов, тогда таблица супертипа может быть удалена. На самом деле никакой FK между двумя таблицами не требуется, поскольку ни в одной из таблиц не должно быть строк, соответствующих текущей строке в другой таблице.