У меня следующая структура таблицы -
Сайт: Мастер-таблица для сайта
Орг: Главный стол для Орг
Пользователь: Основная таблица для пользователя (каждый пользователь связывается с уникальной организацией через
User.OrgId)
OrgSite: Сохранение некоторых «специфичных для Org» деталей сайта (OrgId, SiteId, SiteName,
SiteCode). Не ВСЕ сайты, а только
те, которые доступны для Орг.
UserSite: Ссылка пользователя на его доступные сайты (UserId, SiteId).
Как пользователь связан с Org UserSite
будет подмножеством таблицы OrgSite.
ItemSite : Таблица, в которой хранятся некоторые данные об элементе и сайте (ItemID,
SiteId, OrgId, ...)
Теперь мне нужно отфильтровать \ отобразить записи с «ItemSite», и в этом случае мне также нужно отобразить код сайта. Итак, я вижу следующие два варианта -
1. Создайте VIEW: vw_ItemSite_UserSite_OrgSite (INNER СОЕДИНИТЕ все таблицы на SiteId) - это даст мне доступ ко ВСЕМ деталям Org, доступным в таблице 'OrgSite' (т. Е. SiteCode и т. Д.)
Если вы можете заметить, я должен включить
«OrgSite» в представлении только потому, что я
хотите Org конкретный SiteCode & SiteName.
Потому что пользовательский сайт уже
фильтрация сайтов - так что я могу
«исключить» таблицу OrgSite и
устранить ненужное ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
2. На основании вышеупомянутого примечания - второй вариант - создать VIEW: vw_ItemSite_UserSite и в операторе SELECT VIEW я могу встроить следующий SELECT, например -
CREATE VIEW vw_ItemSite_UserSite AS
SELECT ItemSite.SiteID,
(SELECT TOP 1 [SiteCode] FROM OrgSite WHERE OrgId = ItemSite.OrgId) AS SiteCode,
...
FROM ItemSite INNER JOIN UserSite ON ItemSite.SiteId = UserSite.SiteId
Мое единственное намерение состоит в том, чтобы - я верю, что INNER JOIN и WHERE будут оцениваться до оценки встроенного оператора select. Итак, это спасет меня от производительности? Или лучше использовать vw_ItemSite_UserSite_OrgSite.
Вариант № 1 или №2?
Спасибо.