Найти тему
Уйти в АйТи

Зачем TABLE VIEW (представления) в PostgreSQL? Практики использования, личный опыт

Оглавление

Здравствуйте, уважаемые подписчики и гости канала!

Зачем все это?

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

Также они хорошо заходят, когда у вас есть старый кусок кода, в который вы не хотите лезть, но вам надо сильно поменять структуру таблицы, которую использует этот кусок. И вот, вы просто переименовываете исходную таблицу, проводите миграцию на ней (меняете схему и пр) и создаете VIEW с именем и схемой, как у старой таблицы.

Подборка видео всех видео по PG - https://dzen.ru/suite/37b67ffa-176d-493a-b1a8-4762f79e3753

Как это работает. Пример

Вы скажете, ок - покажи как работать с view. Показываю.

Вот у вас есть какая-то таблица с организациями:

мой пример таблицы организаций
мой пример таблицы организаций

и еще одна с сотрудниками в этих организациях:

мой пример таблицы сотрудников
мой пример таблицы сотрудников

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

Итак, например интегратору надо забрать от вас id, name сотрудника и название его организации, чтобы например в jira как-то выводить. Вы просто делаете VIEW:

мой пример создания view
мой пример создания view

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

Материализованные MATERIALIZED VIEW

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

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

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

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

Ограничения

Нельзя использовать VIEW внутри VIEW, иначе вы не сможете нормально менять исходную VIEW - придется делать DROP VIEW и потом CREATE VIEW.

Если добавляете поля, добавляйте их в конец и тогда можно использовать CREATE OR REPLACE VIEW. Если replace vew не работает, то делаем drop view и create view, но знайте, что на нагруженной БД это не всегда возможно, приведет к простою, блокировкам и всякому такому неприятному.

Фишки

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

В PostgreSQL, а вы возможно уже знаете, что я очень люблю эту базу данных, есть очень крутая тема, которую надо использовать с осторожностью - INSERT, UPDATE триггеры на VIEW. Подробнее вы можете почитать в документации от Postgres Pro. Суть в том, что VIEW может вести себя как таблица, но не давая доступа в таблицу напрямую. Я считаю, что тут или автоматизированно надо этим управлять или очень редко использовать или вообще не соваться, чтобы "просто попробовать прикрутить к новой фиче на проде".

Поскольку VIEW - это запрос, то вместе с LATERAL JOIN можно делать прозрачный и оптимизированный вызов хранимых процедур.

Использую ли лично я VIEW в работе и как же ORM?

Представления мы используем активно, проблем не имеем и радуемся, что такой инструмент есть. Используем и в PostgreSQL и в BigQuery.

Я не люблю ORM и он мне никогда особо не помогал, а на старых проектах просто мешает. Скорее всего это сказывается специфика проектов, над которыми я работаю, но нам orm, так получилось, не нужен.

Так же стоит отметить, что orm часто генерируют мало нормальных запросов, а когда ваш проект становится нагруженным вы не можете быстро оптимизировать нужные места кода, так как код ORM у вас "протек" в рендеринг или api и т.д. И начинаете вы колхозить ;)

А если вы собираетесь использовать фишки view в связке с ORM... Может быть вам это надо, но я бы не стал ))))

Литература

---

А на этом всё, спасибо за внимание!

Подписывайтесь на канал, ставьте лайки, оставляйте комментарии - это помогает продвижению в Дзене.

Кроме этого:

Подписывайтесь в Telegram: https://t.me/lets_goto_it