Как используется дискриминатор подтипа?

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

Я не мог найти реальных примеров этого на практике. Если бы я работал на С#, должен ли я запрашивать столбец дискриминатора подтипа таблицы, а затем проверять некоторый список ключей-> значений ([дискриминатор подтипа]-> имя подтипа_таблицы), чтобы создать правильный SQL для присоединения к правильной таблице?

Или для этой цели в SQL Server уже есть какой-то синтаксис представления/SQL-запроса?

По сути, мне интересно, на каком уровне я должен выполнять логику, чтобы сделать дискриминатор полезным.


person user17753    schedule 15.06.2012    source источник


Ответы (1)


Ваш запрос будет состоять из следующего:

select *
from Root
left join Child1 on ... AND Root.Discriminator = 'C1'
left join Child2 on ... AND Root.Discriminator = 'C2'

И, надеюсь, SQL Server оценивает предикат добавления соединения, прежде чем начать чтение из дочерних таблиц. Хотя это не гарантируется.

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

person usr    schedule 15.06.2012
comment
Спасибо, я попробую ваш ответ позже. Я оставлю вопрос открытым еще некоторое время, чтобы посмотреть, есть ли у кого-нибудь еще комментарии. - person user17753; 16.06.2012
comment
Я попробовал это на некоторых фиктивных БД в sql server 2005. Казалось, это работает нормально, хотя не совсем уверен, что вы имеете в виду в отношении негарантированной части. - person user17753; 18.06.2012
comment
Я делал заявление о производительности. Я надеялся, что опубликованный мной запрос будет обращаться только к Root и соответствующему дочернему элементу во время выполнения (в отличие от простого доступа ко всем таблицам). - person usr; 18.06.2012
comment
Понял, спасибо. Мне действительно очень нравится это решение. Не уверен, почему во всех статьях о дискриминаторе никогда не упоминается такой синтаксис или это просто общеизвестно. - person user17753; 18.06.2012