2017-02-01 7 views
0

Я столкнулся с несколькими статьями, которые в основном используют запрос Entity Framework, чтобы показать, как извлекать данные. Однако, если рассматривать структуру таблицы ниже:Поиск данных на основе данных в таблице

Table Per Type sample

Если я хочу найти деталь автомобиля с ID 2, используя только простой SQL, я должен использовать идентификатор, чтобы посмотреть на матч в унаследовали таблицы («Использованный автомобиль» и «Новый автомобиль» в этом примере)?

Разве это не вызывает полную проверку таблицы «Используемый автомобиль», прежде чем я найду ее в таблице «Новый автомобиль»? Или есть способ, которым я мог бы знать, что мне нужно напрямую зайти в «Новый автомобиль»?

Или мое предположение о неправильном дизайне Table-Per-Type?

+1

Невозможно с TPT узнать, какая «производная» таблица содержит данные для определенного идентификатора. Информация всегда извлекается с помощью объединений. См. Раздел ** Вопросы TPT ** в разделе [Наследование с кодом EF Сначала: Часть 2 - Таблица для каждого типа (TPT)] (https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework -code-first-ctp5-part-2-table-per-type-tpt) –

+0

@IvanStoev Спасибо. Для наследования 1 уровня, где у меня есть 1 базовая таблица и говорят 10 ближайших дочерних таблиц, будет ли производительность проблемой? Я считаю, что производительность может быть проблемой, если у меня есть несколько уровней наследования. Правильно ли я понимаю? – Ayusman

+0

ИМО, да. Я бы рекомендовал вам прочитать целую серию из ссылки, автор подробно объясняет все 3 стратегии наследования EF с плюсами и минусами каждого (ни один из них не идеален). –

ответ

2

Если вы хотите найти год, вы можете сделать:

select c.*, coalesce(uc.year, nc.year) as year, 
     (case when uc.id is not null then 'Used' else 'New' end) as which 
from car c left join 
    usedcar uc 
    on c.id = uc.id left join 
    newcar nc 
    on c.id = nc.id 
where c.id = 2; 

Вы должны объявить id в качестве первичного ключа во всех таблицах (хотя я бы назвал его carId). Тогда сканирование не будет выполнено. Просто поиск индекса.

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

+0

Большое спасибо. Не могли бы вы объяснить, что делает эта часть запроса: «coalesce (uc.year, nc.year) как год, (случай, когда uc.id не имеет значения null, то« Used 'else' New 'end), что «и почему есть 2 левых соединения? – Ayusman

+0

Не волнуйся, я понял. И снова спасибо за помощь. – Ayusman

Смежные вопросы