2012-06-15 4 views
2

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

Я не нашел реальных примеров этого на практике. Если бы я работал на C#, я бы предположил, что вы запрашиваете столбец дискриминатора подтипа таблицы, а затем протестируйте против некоторого списка key-> value ([sub type discinator] -> subtype_table_name), чтобы создать правильный SQL для присоединения к правильной таблице?

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

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

ответ

2

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

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

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

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

+0

Спасибо, я попробую ответить позже. Я оставлю вопрос открытым дольше, чтобы узнать, есть ли кто-либо еще. – user17753

+0

Я пробовал это на некоторых фиктивных БД в sql server 2005. Казалось, он работает нормально, но не совсем уверен, что вы имеете в виду не гарантированную часть. – user17753

+0

Я делал заявление о производительности. Я надеялся, что запрос, который я разместил, будет иметь доступ только к Root и соответствующему ребенку во время выполнения (в отличие от простого доступа ко всем таблицам). – usr