Какая веская причина использовать представления SQL?

101

Я читаю библию по SQL Server 2008 и освещаю раздел представлений. Но автор толком не объясняет цель просмотров. Что хорошего в просмотрах? Стоит ли использовать их на своем веб-сайте и в чем их преимущества?

Люк101
источник
Не могли бы вы предоставить мне файлы базы данных этой книги "Библия SQL Server 2008"? Сайт автора мертв, и я не могу с ним связаться.

Ответы:

94

Другое использование, о котором, похоже, не упоминалось ни в одном из предыдущих ответов, - это более простое развертывание изменений структуры таблицы.

Скажем, вы хотите удалить таблицу ( T_OLD), содержащую данные для активных пользователей, и вместо этого использовать новую таблицу с аналогичными данными (названными T_NEW), но с данными как для активных, так и для неактивных пользователей, с одним дополнительным столбцом active.

Если в вашей системе (ах) есть миллионы запросов, у SELECT whatever FROM T_OLD WHERE whateverвас есть два варианта развертывания:

1) Холодная Турция - измените БД, и в то же время измените, протестируйте и выпустите многочисленные фрагменты кода, содержащие указанный запрос. ОЧЕНЬ сложно сделать (или даже скоординировать), очень рискованно. Плохой.

2) Постепенное - изменение БД, создав T_NEWтаблицу, опуская T_OLDтаблицу и вместо того, чтобы создать VIEW под названием , T_OLDчто имитирует T_OLDтаблицу 100% (например , вид запроса SELECT all_fields_except_active FROM T_NEW WHERE active=1).

Это позволит вам избежать выпускать любой код , который в настоящее время выбирает из T_OLD, и сделать изменения мигрировать код из T_OLDк T_NEWна досуге.

Это простой пример, есть и другие, гораздо более сложные.

PS С другой стороны, вам, вероятно, следовало бы иметь API хранимых процедур вместо прямых запросов из T_OLD, но это не всегда так.

ДВК
источник
3
Я не знал термина «хранимой процедуры API» и связанных с ними плюсы / минусы и нашел эту статью полезной: codinghorror.com/blog/2005/05/...
Джефф Widman
Извините, я опоздал на вечеринку, но как насчет выступления. Если мне потребовались объединения в исходной таблице, и я вместо этого присоединюсь к представлению, будет ли он использовать лучший план выполнения?
Zikato
@Zikato да, если это индексированный просмотр
LinkBerest
V Хорошая индикация
Афнан Ахмад
47

(Скопировано из первого руководства, появившегося в поиске Google (ссылка теперь мертва), но в нем есть все преимущества, которые я бы сам набрал вручную.)

Просмотры имеют следующие преимущества:

  • Безопасность - представления можно сделать доступными для пользователей, в то время как базовые таблицы недоступны напрямую. Это позволяет администратору баз данных предоставлять пользователям только те данные, которые им нужны, одновременно защищая другие данные в той же таблице.
  • Простота - представления можно использовать для скрытия и повторного использования сложных запросов.
  • Упрощение или уточнение имени столбца - представления могут использоваться для предоставления псевдонимов имен столбцов, чтобы сделать их более запоминающимися и / или значимыми.
  • Ступенька - представления могут стать отправной точкой в ​​«многоуровневом» запросе. Например, вы можете создать представление запроса, в котором подсчитывается количество продаж, совершенных каждым продавцом. Затем вы можете запросить это представление, чтобы сгруппировать продавцов по количеству произведенных ими продаж.
Дэвид
источник
Поскольку мне нравится ваш ответ и я не вижу смысла добавлять еще один, могу ли я предложить два дополнения к вашему списку? Индексированные представления могут повысить производительность. Запуск обновлений по представлениям, а не напрямую к таблицам, может дать большую уверенность в том, что вы не обновите эту ключевую производственную таблицу неправильно :)
Дэвид Холл,
Еще один пункт в вашем списке. Большинство администраторов баз данных хотели бы использовать представление, потому что они могут настроить одно представление и в большинстве случаев (не всегда) все запросы, использующие это представление, будут настроены.
Нитин Мидха
Это 99% ответов из моей книги.
Джон Стидман
Кстати, @David неработающая ссылка
Мануэль Джордан
Последний пункт, нельзя ли использовать для этого временную таблицу?
Цзечао Ван,
16

Некоторые причины из Википедии :

Представления могут иметь преимущества перед таблицами:

  1. Представления могут представлять подмножество данных, содержащихся в таблице.
  2. Представления могут объединять и упрощать несколько таблиц в одну виртуальную таблицу
  3. Представления могут действовать как агрегированные таблицы , где ядро ​​базы данных агрегирует данные (сумму, среднее значение и т. Д.) И представляет вычисленные результаты как часть данных.
  4. Представления могут скрыть сложность данных ; например, представление может отображаться как Sales2000 или Sales2001, прозрачно разделяя фактическую базовую таблицу
  5. Представления занимают очень мало места для хранения ; база данных содержит только определение представления, а не копию всех данных, которые он представляет
  6. В зависимости от используемого механизма SQL представления могут обеспечивать дополнительную безопасность.
  7. Представления могут ограничивать степень воздействия таблицы или таблиц на внешний мир.
user210748
источник
14

VIEWS могут использоваться как повторно используемые разделы SELECT / CODE, которые могут быть включены в другие выборки / запросы, к которым нужно присоединиться, и использовать различные различные фильтры, без необходимости заново создавать весь SELECT каждый раз.

Это также размещает логику в одном месте, так что вам не нужно менять ее во всей базе кода.

Посмотри на

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

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

Адриан Стандер
источник
6
Будьте очень осторожны при этом. Если вы используете представления, которые вызывают другие представления, вы можете создать огромный беспорядок с производительностью.
HLGEM
вы можете сделать это, создав метод и поместив запрос SQL внутри метода. Этот метод можно каждый раз использовать повторно. Тогда зачем смотреть ???
ASharma7
10

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

Это интерфейс.

dkretz
источник
1
Пока вы не складываете представления в представления для дальнейшей абстракции.
HLGEM
Я думаю, что я эффективно отказался от любой многоуровневой абстракции в реляционных базах данных. И я тоже не вызываю хранимые процедуры из хранимых процедур. :)
dkretz
3

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

Таблица: USERS содержит всех пользователей

Представление: ACTIVE_USERS содержит всех пользователей, за исключением тех, которые заблокированы, заблокированы, ожидают активации и не соответствуют каким-либо критериям, которые вы можете определить в будущем как часть активных требований. Это избавляет от необходимости удалять какие-либо строки из таблицы USERS, если вы решите этого не делать, потому что ACTIVE_USERS всегда может скрыть ненужные строки.

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

Нефсу
источник
2

Представления могут позволить вам объединять данные из нескольких разных таблиц и форматировать их (объединять поля, давать более понятные имена полей и т. Д.), Чтобы это было проще для конечных пользователей. Они являются абстракцией модели базы данных. Их также можно использовать для предоставления пользователям доступа к данным в таблице, не давая им прямого доступа к самой таблице.

TLiebe
источник
2

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

  • Простота - представления можно использовать, чтобы скрыть сложные запросы.
  • Безопасность - просмотр может скрывать важную информацию от конечного пользователя, создавая представление для некоторых выбранных столбцов.
  • Безопасность - Защитите таблицу, чтобы изменить ее структуру с помощью VIEW.
  • Избыточность - сокращение избыточного кода в каждой процедуре / запросе с помощью общего представления.
  • Расчет - все расчеты можно выполнить один раз в запросе просмотра.
  • Значимое имя - таблица может иметь имя для идентификатора, например tbl_org_emp_id, которое может иметь псевдоним, например [Номер сотрудника] или какое-либо значимое имя.

С сайта imexploring.com

Али Адрави
источник
1

Небольшой список общих причин / использования:

  • используйте их для изменения формата или «вида» данных (например, вы можете объединить имя и фамилию вместе)

    выполнять вычисления или другие поиски данных

    денормализовать данные (извлечь данные из нескольких таблиц в одно место)

слизняк
источник
-6

Взгляды злы! По возможности избегайте их и используйте только по указанной DVK причине - временная миграция данных.

Вы должны понимать, что в базе данных со 100 таблицами трудно запомнить назначение каждой таблицы. Теперь, если вы добавите сюда еще 300 просмотров, это станет полным беспорядком. «Любители представлений» склонны использовать вложенные представления, а затем использовать вложенные представления в хранимых процедурах. Сейчас я лично работаю с базой данных, в которой 4 раза глубоко вложены просмотры! Итак, чтобы понять простейшую логику хранимой процедуры, мне нужно сначала просмотреть все представления.

Дэн
источник
8
-1 Просмотры хорошие. Они могут стать злыми, если вы используете их ненадлежащим образом - но это правда практически в любом случае.
NullUserException
1
Взгляды могут быть злыми, если их использовать неправильно. Люди, которые используют их плохо, чаще всего кажутся теми, кто использует их для абстрагирования, а затем делает, как вы говорите, вызывая представления, которые вызывают представления, вызывающие представления до точки, где вам может потребоваться материализовать 10 миллионов повторных созданий, прежде чем возвращать результат набор из 3. Представления, непосредственно вызывающие таблицы, могут быть очень полезны.
HLGEM
@HGLEM есть ли способ ограничить вызовы просмотра из других представлений?
Игорь Солоденко 08