Для чего нужны просмотры?

87

Я просто пытаюсь получить общее представление о том, какие представления используются в СУБД. То есть я знаю, что такое представление и как его создать. Я также знаю, для чего я их использовал в прошлом.

Но я хочу быть уверенным, что у меня есть полное представление о том, для чего полезно представление, а для чего оно не должно быть полезным. Более конкретно:

  1. Для чего нужен просмотр?
    • Есть ли ситуации, в которых возникает соблазн использовать представление, хотя вам не следует его использовать?
    • Зачем использовать представление вместо функции, возвращающей табличное значение, или наоборот?
    • Есть ли обстоятельства, при которых представление может быть полезным, но не очевидное на первый взгляд?

(И для протокола: некоторые из этих вопросов намеренно наивны. Отчасти это проверка концепции.)

Джейсон Бейкер
источник
1
похоже на вопрос, размещенный здесь: stackoverflow.com/questions/1278521/…
MedicineMan
Я чувствую, что stackoverflow.com/questions/1278521/… дает лучшие ответы на этот вопрос.
GinTonic

Ответы:

42

1) Чем полезен вид?

IOPO только в одном месте

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

• Представления также обеспечивают уровень абстрагирования, предотвращающий прямой доступ к таблицам (и, как следствие, наручники, ссылающиеся на физические зависимости). На самом деле, я думаю, что это хорошая практика 1 - предлагать только абстрактный доступ к вашим базовым данным (с использованием представлений и функций с табличным значением), включая представления, такие как 1. Я должен признать, что есть много «Делай, как я говорю, а не так, как я делать "в том совете;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Есть ли ситуации, в которых возникает соблазн использовать представление, хотя вам не следует его использовать?

Производительность при объединении представлений раньше была проблемой (например, SQL 2000). Я не эксперт, но давно не беспокоился об этом. (Я также не могу придумать, где я сейчас использую соединения представлений.)

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

    • См. Описание производной таблицы в http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Зачем использовать представление вместо функции, возвращающей табличное значение, или наоборот?

(Помимо соображений производительности) Возвращающая табличное значение функция функционально эквивалентна параметризованному представлению. Фактически, обычным вариантом использования простой возвращающей табличное значение функции является простое добавление фильтра предложения WHERE к уже существующему представлению в единственном объекте.

4) Существуют ли какие-либо обстоятельства, при которых представление может быть полезным, но не очевидное на первый взгляд?

Я не могу вспомнить ни о каком неочевидном использовании макушки моей головы. (Полагаю, если бы я мог, это сделало бы их очевидными;)
6 Джордж Джетсон
источник
9
Я бы не согласился с тем, что имеет смысл создавать представление для таблицы, если это SELECT * FROM tblData. Не могли бы вы объяснить, почему это было бы полезно?
Зарегистрированный пользователь
IOPO - только в одном месте - это хорошо известная дизайнерская фраза? Я не могу найти много ссылок на это? Есть ли у него другие формы, например СУХОЙ?
Роберт
1
@Robert Да, DRY, нормализация, IOPO, это разные варианты одной и той же философии.
TylerH
45

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

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

Лу Франко
источник
21

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

тупица
источник
18

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

Килхоффер
источник
-1 «просмотры денормализуют»? извините, но это ерунда, если она не квалифицирована каким-либо образом.
просто кто-нибудь
18
Они абсолютно денормализованы. Если у вас есть связанные таблицы, которые нормализованы к 3-ей номинальной форме, и вы создаете представление, чтобы «сгладить» эти отношения, как это не денормализация?
Килхоффер 05
11

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

Например, вместо выполнения в приложении:

sql = "выберите a, b из таблицы 1 union выберите a, b из таблицы 2";

Вы можете абстрагировать это до представления:

создать представление union_table1_table2_v как
выбрать a, b из table1
union
выбрать a, b из table2

а в коде приложения просто укажите:

sql = "выберите a, b из union_table1_table2_v";

Кроме того, если структуры данных когда-либо изменятся, вам не придется изменять код приложения, перекомпилировать и повторно развертывать. вы бы просто изменили представление в db.

CodingWithSpike
источник
Почему мне нужно писать сложный sql в базе данных вместо приложения?
Иван Вирабян
3
Чем сложнее ваш запрос, тем больше вероятность, что он изменится в будущем, отчасти из-за того, что он просто попадет в большее количество таблиц. Когда изменятся структуры БД, вам также придется изменить свой код и сделать релиз. Если эта сложность абстрагирована в представлении, администратор баз данных может внести структурные изменения в подчиненные таблицы без необходимости изменения вашего кода.
CodingWithSpike
11

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

gsarnold
источник
6

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

Чего вы не хотите использовать для замены сложных объединений. То есть, не позволяйте вашей привычке процедурного программирования разбивать проблему на более мелкие части, приводя вас к использованию нескольких объединенных вместе представлений вместо одного большего соединения. Это убьет эффективность ядра базы данных, поскольку он, по сути, выполняет несколько отдельных запросов, а не один более крупный.

Например, предположим, что вам нужно объединить таблицы A, B, C и D. У вас может возникнуть соблазн создать представление из таблиц A и B и представление из C и D, а затем объединить эти два представления вместе. Гораздо лучше просто объединить A, B, C и D в одном запросе.

Барри Браун
источник
Я не думаю, что это правильно, по крайней мере, так утверждает теория СУБД (различные реализации могут решить не соблюдать теорию). Парсер запросов по существу заменит любые просмотренные им представления на соответствующий sql, и оптимизатор перейдет оттуда. Эти 2 случая должны быть эквивалентными.
SquareCog
Это также неверно, когда вы можете добавлять индексы к своим представлениям.
therealhoff
Я больше всего знаком с PostgreSQL, и более ранние версии не очень хорошо сочетали запросы. Но более новые намного лучше. Мой ответ больше не применим, по крайней мере, для этой конкретной СУБД.
Barry Brown
5

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

Джоэл Кохорн
источник
4

Ответы на данный момент верны - представления хороши для обеспечения безопасности, денормализации (хотя в этом случае будет много проблем, если они будут сделаны неправильно), абстракции модели данных и т. Д.

Кроме того, представления обычно используются для реализации бизнес-логики (истекший пользователь - это пользователь, который не входил в систему в течение последних 40 дней, и тому подобное).

SquareCog
источник
если вы денормализуете, добавив 7 справочных таблиц, а затем запросите то, для чего нужна только одна из этих справочных таблиц. Это много потраченных впустую усилий. Становится хуже, если вы начнете присоединяться к таким взглядам.
SquareCog
ты уверен в этом? MSDN сообщает: «Когда SQL Server обрабатывает запросы, которые ссылаются на представления по имени, определения представлений обычно расширяются до тех пор, пока они не будут ссылаться только на базовые таблицы. Этот процесс называется расширением представления. Это форма макро-расширения ». Я предполагаю, что во время процесса расширения движок будет достаточно умен, чтобы включать только базовые таблицы (представления), которые необходимы для запроса.
Энтони
Энтони, представьте себе такой запрос, как «select foo_col from (select foo. *, Bar. * From foo join bar on (foo.id = bar.id))». В этом запросе внутренний выбор - это наше представление. Это не ясно, что соединение бара можно безопасно отбросить (на самом деле, если отношение не строго 1-1, оно не может). Это становится еще сложнее с более сложными запросами, и я бы не рекомендовал полагаться на общую СУБД для выполнения всех обрезка человека может. Может быть, SQL Server может; я был бы шокирован, если бы это сделал MySQL. Oracle? Postgres? Как всегда, прочтите план запроса, если сомневаетесь.
SquareCog
3

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

Мухаммед
источник
2

Представление - это просто сохраненный оператор SELECT. Думайте о представлениях как о библиотечных функциях.

Гай
источник
Разве для этого не годятся хранимые процедуры? Иногда вам нужны функции с удалениями и обновлениями, которые не подходят для этой потребности. Представления следует рассматривать как абстракции или способы ограничения целевого пользователя.
HumbleWebDev
1

Я хотел выделить использование представлений для отчетности. Часто возникает конфликт между нормализацией таблиц базы данных для повышения производительности, особенно при редактировании и вставке данных (использует OLTP), и денормализацией для уменьшения количества объединений таблиц для запросов для отчетов и анализа (использование OLAP). При необходимости, обычно выигрывает OLTP, потому что ввод данных должен иметь оптимальную производительность. Таким образом, создание представлений для оптимальной производительности отчетов может помочь удовлетворить оба класса пользователей (средства ввода данных и средства просмотра отчетов).

ДОК
источник
1

Я помню очень длинный SELECT, в котором участвовали несколько UNION. Каждый UNION включал присоединение к таблице цен, которая была создана на лету с помощью SELECT, который сам был довольно длинным и трудным для понимания. Я думаю, что было бы неплохо иметь представление об этом для создания таблицы цен. Это сократило бы общий SELECT примерно вдвое.

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

SeaDrive
источник
Oracle CBO может выбрать однократную оценку представления (материализовать, они это называют) или объединить SQL для представления с остальной частью оператора select и запустить его. Он будет принимать решение на основе того, что имеет более низкую оценочную стоимость.
WW.
Если оператор select был постоянным на протяжении всего запроса и просто повторялся несколько раз, то общее табличное выражение (CTE) могло решить проблему. Это применимо только к SQL Server 2005/2008, так как он не был доступен в SQL Server 2000. Да, представление все равно будет вызываться повторно.
Зарегистрированный пользователь
@ Зарегистрированный пользователь: CTE не являются специальностью SQL Server. Они возникли в DB2 и также присутствуют в PostgreSQL (поскольку они полезны и в стандарте ISO SQL). Независимо от того, является ли представление встроенным или рассматривается как черный ящик, зависит от реализации, некоторые СУБД умнее других.
просто кто-нибудь
@just something: мой комментарий был ограничен SQL Server 2005/2008, поскольку у меня нет опыта работы с CTE в других RBDMS. Кроме того, комментарий был квалифицирован, чтобы указать, что это не относится к SQL Server 2000, поскольку CTE не были доступны в SQL Server до 2005 года.
Зарегистрированный пользователь,
Другой альтернативой просмотру было бы заранее поместить таблицу цен во временную таблицу.
SeaDrive
0

В любое время, когда вам понадобится [my_interface]! = [User_interface].

Пример:

ТАБЛИЦА A:

  • мне бы
  • Информация

ВИД на ТАБЛИЦУ A:

  • Информация для клиентов

таким образом вы можете скрыть идентификатор от клиента и одновременно переименовать информацию в более подробное имя.

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

HumbleWebDev
источник