Если я правильно понимаю ваше предложение, то, о чем вы думаете, это незначительное изменение в «Единой истинной таблице поиска» (OTLT), что не является хорошей идеей. В этом случае, возможно, OTLT расшифровывается как «One True Linking Table».
Проблемы возникают, когда вам необходимо поддерживать ссылочную целостность OTLT. Для начала, какова его схема?
ReferencingTable INTEGER (or VARCHAR(xx)?)
ReferencingId INTEGER
ReferencedTable INTEGER (or VARCHAR(xx)?)
ReferencedId INTEGER
Идентификаторы таблицы должны быть просмотрены. Они могут быть копиями значения в системном каталоге, но вам нужно беспокоиться о том, что произойдет, когда вы перестраиваете таблицы (как правило, изменяется идентификатор таблицы). Или это могут быть отдельно контролируемые значения - параллельный набор таблиц.
Далее вам нужно беспокоиться об асимметрии в именовании столбцов в том, что должно быть симметричным; OTLT соединяет Таблицу1 с Таблицей2 так же, как соединяет Таблицу2 с Таблицей1 - если только ваши отношения не являются асимметричными. Это просто чрезвычайно усложняет жизнь.
Теперь предположим, что вам нужно соединить первичные таблицы от Table1 до Table2 и от Table2 до Table3, каждая через OTLT, и что идентификаторы таблицы равны 1, 2 и 3, и что ReferencingTable всегда меньше два в OTLT:
SELECT T1.*, T2.*, T3.*
FROM Table1 AS T1
JOIN OTLT AS O1 ON T1.Id = O1.ReferencingId AND O1.ReferencingTable = 1
JOIN Table2 AS T2 ON T2.Id = O1.ReferencedId AND O1.ReferencedTable = 2
JOIN OTLT AS O2 ON T2.Id = O2.ReferencingId AND O2.ReferencingTable = 2
JOIN Table3 AS T3 ON T3.Id = O2.ReferencedId AND O2.ReferencedTable = 3
Итак, у вас есть два независимых набора соединений через OTLT.
Альтернативная формулировка использует отдельные соединительные таблицы для каждой пары. Строки в этих соединяющих таблицах меньше:
ReferencingID INTEGER
ReferencedID INTEGER
И, предполагая, что объединяющие таблицы называются Join_T1_T2 и т. Д., Запрос выше становится:
SELECT T1.*, T2.*, T3.*
FROM Table1 AS T1
JOIN Join_T1_T2 AS J1 ON T1.Id = J1.ReferencingId
JOIN Table2 AS T2 ON T2.Id = J1.ReferencedId
JOIN Join_T2_T3 AS J2 ON T2.Id = J2.ReferencingId
JOIN Table3 AS T3 ON T3.Id = J2.ReferencedId
Существует столько же ссылок на таблицы (5), сколько и раньше, но СУБД может автоматически поддерживать ссылочную целостность в этих соединяемых таблицах - тогда как обслуживание должно быть написано вручную с помощью OTLT. Объединения проще (без предложений AND).
На мой взгляд, это сильно влияет на систему OTLT и в пользу специализированных таблиц связывания для каждого значимого соединения первичных таблиц.