Для чего нужны взгляды?

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

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

  • Для чего полезно?
    • Есть ли ситуации, когда возникает соблазн использовать представление, если вы не должны использовать его?
    • Почему вы используете представление вместо чего-то вроде функции с табличной оценкой или наоборот?
    • Есть ли какие-либо обстоятельства, что представление может быть полезным, которое не очевидно на первый взгляд?

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

Ответ 1

1) Для чего полезно представление?

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

& bull; Рассматриваете ли вы сами данные или запросы, ссылающиеся на объединенные таблицы, используя представление, избегающее ненужной избыточности.

& bull; Представления также обеспечивают слой абстрагирования, препятствующий прямому доступу к таблицам (и результирующие наручники, ссылающиеся на физические зависимости). На самом деле, я думаю, что хорошая практика 1 предлагает только абстрагированный доступ к вашим базовым данным (с использованием функций views & table-valued), включая такие взгляды, как

CREATE VIEW AS
      SELECT * FROM tblData


1 Я признаю там много "Делайте, как я говорю, не так, как я" в этом совете;)

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

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

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

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

3) Почему вы используете представление вместо чего-то вроде табличной функции или наоборот?

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

В качестве примера, а не в приложении:

sql = "выберите a, b из объединения table1 выберите a, b из таблицы2";

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

создать представление union_table1_table2_v как
выберите a, b из таблицы1
союз
выберите a, b из таблицы2

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

В любое время вам нужно [my_interface]!= [user_interface].

Пример:

ТАБЛИЦА A:

  • ID
  • Информация

VIEW для таблицы A:

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

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

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