Когда использовать представления базы данных, а когда нет?
Этот вопрос касается представлений базы данных, а не материализованных представлений.
Плюсы:
- Упрощение запросов.
- Избегайте повторения одних и тех же объединений на несколько запросов.
- Избегайте магических чисел.
Минусы:
- Скрытие реальных запросов (может быть, вы повторяете соединения).
Что-то еще?
7 ответов
Плюсы: Позволяет изменять базовые структуры данных, не влияя на запросы приложений (если ваше представление может скрывать структуры данных)
Безопасность. Предоставьте доступ к представлению пользователям, которые должны видеть столбцы, возвращаемые из него.
Представления довольно удивительны, когда вы не полностью доверяете стороне, отправляющей запросы в вашу базу данных. Хорошим примером может быть то, что вы создадите представление для таблиц для подрядчика, чтобы они могли видеть только строки, относящиеся к его проекту.
Хотя представления могут скрывать сложность и множественные объединения, это сложность, которая в любом случае была бы в SP.
Если бы SP можно было оптимизировать, то представление должно быть оптимизировано, что привело бы к повышению производительности на всех SP, попадающих в это представление.
Представления невероятно мощные и полезные по одной причине, которая выделяется над всеми другими очень вескими причинами. Они уменьшают дублирование кода. То есть в большинстве случаев нижняя строка. Если запрос будет использоваться в трех или более местах, то представление существенно упростит ваши изменения, если схема или параметры запроса изменятся.
Однажды мне пришлось отредактировать 22 хранимые процедуры, чтобы изменить логику запроса. Если бы оригинальная архитектура использовала представления, то у меня было бы только три изменения.
Теперь, когда в SQL Server есть общие табличные выражения, я создаю меньше представлений. Когда я создаю представление, обычно это нормализованная иерархия, которая может использоваться во многих запросах, а не что-то, что заменяет один запрос.
Например, Region, Market и City могут быть тремя нормализованными таблицами (снежинка). 90% моих запросов нуждаются в этих данных, поэтому я создам представление. Представление никогда не заменяет один запрос, но делает все остальные запросы простыми и СУХИМЫМИ.
Мне приходилось несколько раз использовать представления для создания странных объединений и группировки по псевдонимам.
Под странными объединениями я имею в виду выбор списка отдельных дат и последующее внешнее объединение их с таблицей, из которой они пришли, чтобы получить пустые записи для пустых дней. Я не мог придумать другого способа сделать это.
Что касается группировки по псевдонимам, то она, похоже, зависит от сложности формулы внутри псевдонима. Если псевдоним не ссылался ни на какие фактические столбцы или столбцы, которые уже группировались, все было в порядке, но псевдонимы столбцов, которые не были включены в группировку, вызывали ошибки.
Кажется, я вспоминал, что читал или слышал где-то в мои университетские дни, что выбор из представления был быстрее, чем выбор из нескольких объединенных таблиц, но я не знаю, правда ли это.
Последнее преимущество использования представления: сводные таблицы в Excel. Я не думаю, что есть способ объединения таблиц или, по крайней мере, не в интерфейсе мастера. Возможно, можно делать объединения в Microsoft Query, но я еще не пробовал, потому что эта мысль пришла мне в голову сейчас.
Представления легче протестировать, чем сложный запрос. Когда вы представляете себе модульное тестирование SQL, на помощь приходят представления.
Я использовал их все время, сейчас редко. Однако я делаю все свои данные с помощью хранимых процедур, поэтому полезность представления несколько меньше, поскольку SP может скрывать сложность объединения, где это необходимо.
Я бы все еще подумал об использовании представления, если бы a было особенно сложным соединением многих таблиц, из которого мне нужно было потом построить много SP, но, честно говоря, я не могу думать о том, что у меня есть в производстве прямо сейчас.,
Другой сценарий, который я бы использовал, был бы один, когда мои пользователи имеют доступ к базе данных для генерации своих собственных отчетов, и я хотел скрыть скрытую сложность для них.