Изучая СУБД PostgreSQL можно часто слышать слово «Представление» (View) рядом со словом «Таблица» (Table). Что это такое простыми словами?
Представление — это способ задать ИМЯ для запроса SELECT на выборку данных и по этому ИМЕНИ быстро получать нужную «собранную» таблицу. То есть можно создать сложный запрос в базу данных и дать ему имя, чтобы каждый раз не расписывать полный SELECT.
Представление — это как-бы обёртка над запросом выборки данных через SELECT.
Представление — это «вычисленный» результат в виде таблицы.
Важно !!!
Имейте ввиду, что в PostgreSQL существует 2 вида Представлений:
- Обычное Представление (VIEW)
- Материализованное Представление (MATERIALIZED VIEW)
В чём разница между Обычным и Материализованным Представлениями?
Ключевая разница в СКОРОСТИ ОТВЕТА.
Обычное Представление не хранит данные, а только выполняет описанный в себе запрос. Это значит, что тратится некоторое время на получения ответа от самого Представления и его Запроса, так как данных в готовом виде нет.
Материализованное Представление — это готовая таблица с данными, которые были сформированы в момент создания самого Материализованного Представления. Когда выполнился запрос на выборку данных, то на это был сформирован и запущен SELECT. Когда данные пришли в виде готовой таблицы, то эта таблица сохранилась в самой базе данных. В таком виде нам не нужно тратить время на «собирание» таблицы т. к. она уже собрана. Ответ будет мгновенным.
НО!!! Из-за скорости приходится жертвовать дисковым пространством, потому что по факту данные клонируются в новую таблицу. Данные(строки) в Материализованном Представлении нельзя изменить или удалить. Можно удалить только всё Материализованное Представление, при этом данные в оригинальной таблице/таблицах никуда не денутся.
Материализованное Представление — это способ дублирования данных и защита оригинальных данных.
Так как Материализованное Представление формируется в момент своего создания, то его периодически нужно обновлять. Если оригинальная таблица изменяется, то данные в Материализованном Представлении будут устаревать. Как часто обновлять? Нет ответа. Это зависит от многих факторов.
Какой командой создаётся «Представление» в PostgreSQL?
Команда CREATE VIEW создаёт «Представление» в СУБД PostgreSQL.
Синтаксис «Представления» в PostgreSQL
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW имя [ ( имя_столбца [, ...] ) ] [ WITH ( имя_параметра_представления [= значение_параметра_представления] [, ... ] ) ] AS запрос [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
имя — это имя создаваемого представления (возможно, дополненное схемой).
имя_столбца — это необязательный список имён, назначаемых столбцам представления. Если отсутствует, имена столбцов формируются из результатов запроса.
запрос — это команда SELECT или VALUES, которая выдаёт столбцы и строки представления.
Квадратными скобками указаны опциональные параметры, которых может не быть в SQL-запросе.
Пример использования обычного Представления для ограничения выборки данных
Например. У вас есть одна огромная таблица, в которой есть 8 столбцов. Пусть это будут автомобили.
Вы можете создать другую таблицу на её основе, в которой будут видны только данные из 3 столбцов. Пусть это будут: Брэнд авто, Модель авто и Пробег авто.
При этом в новой возвращённой таблице не будет никаких данных. Новая таблица будет ссылаться на данные своего родителя. Пусть Схема в БД будет назваться test1.
-- Работа с представлением VIEW create view test1.cbmm as select brand, model, mileage from test1.cars;
Мы называем наше Представление — cbmm. В результате вы получаете возможность ограничить вывод информации при отборе и ещё можете это как-то обозвать для удобства обращения.
Вот это и называется «Представление»
-- Обращение к Представлению select * from test1.cbmm;
Оно всегда выполняется на выборку данных. Как правило через оператор SELECT.
В момент запроса к Представлению осуществляется реальный Запрос в базу данных. Выборка данных также будет занимать некоторое время как в случае с обычной таблицей.
В ответ мы получаем таблицу с ограниченным набором данных, относительно оригинальной таблицы из которой мы сделали это Представление.
Но отдавать такую таблицу на Клиент лучше не стоит т. к. заголовки столбцов берутся напрямую из базы данных. Так раскрывается внутреннее устройство БД. Этого лучше не делать.
Пример № 2
У вас есть две таблицы с данными.
Таблицы никак не связаны друг с другом. Нет связи «один ко многим», «один к одному».
Вы можете создать такой шаблон склеивания данных из двух таблиц, при котором получится третья таблица.
При этом в новой таблице не будет никаких данных. Новая таблица будет ссылаться на данные из других таблиц.
Альтернатива Представлениям. Что можно использовать для получения сборных таблиц?
У представлений есть один жирный минус. Представлениями нельзя создавать динамические запросы. В представления нельзя взять и подставить нужные значения, для получения индивидуального табличного результата.
Также представления жёстко связываются с объектами СУБД, которые описаны в ЗАПРОСЕ самого представления. Использовать их на этапе разработки не имеет смысла.
Если по какой-то причине, нам нужно будет поменять структуру таблиц, которые есть в ЗАПРОСЕ представления, то может произойти каскадное удаление самого представления. В результате мы можем потерять саму логику работы ЗАПРОСА нашего представления.
Чтобы не потерять нужные элементы работы базы данных, нужно создавать ТАБЛИЧНЫЕ ФУНКЦИИ в PostgreSQL. С ними гораздо удобнее работать, потому что они не удалятся самостоятельно. Если структура поменяется, то функция просто выполнится с ошибкой. И такую ошибку можно будет отследить.
Информационные ссылки
Официальный сайт PostgreSQL — https://www.postgresql.org
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Документация PostgreSQL — Команда CREATE VIEW — https://postgrespro.ru/docs/postgresql/14/sql-createview
Раздел «38.5.10. Функции SQL, возвращающие таблицы (TABLE)» — https://postgrespro.ru/docs/postgresql/14/xfunc-sql#XFUNC-SQL-FUNCTIONS-RETURNING-TABLE
Команды SQL — https://postgrespro.ru/docs/postgresql/14/sql-commands
Команда SELECT — https://postgrespro.ru/docs/postgresql/14/sql-select