Что такое вьюхи и вьюсеты в базах данных
Что проверяют
Не смешиваете ли вы два разных «вью»: представление в базе и вьюсет веб-фреймворка. Вопрос звучит слитно намеренно, и сильный ответ начинается с разведения понятий, потому что живут они на разных уровнях.
Как отвечать
Представление в базе это сохранённый запрос с именем. Данных оно не хранит, при обращении подставляется в план запроса. Нужно оно, чтобы спрятать сложное соединение, зафиксировать правило в одном месте и выдать урезанный набор колонок тем, кому нельзя видеть всё.
Рядом стоит материализованное представление: оно как раз хранит результат и требует явного обновления, то есть это кэш с вопросом об актуальности, а не окно в данные. Обычное представление бывает и обновляемым, если запрос за ним достаточно простой.
create view active_orders as
select id, customer_id, total from orders where status = 'active';Вьюсет это уже слой приложения. В Django REST Framework он собирает обработчики одного ресурса в один класс, а роутер разворачивает его в набор адресов: список, чтение, создание, изменение, удаление. Переопределяют обычно выборку, права и сериализатор, а нестандартные операции добавляют декоратором дополнительного действия.
Полезно связать уровни: представление из базы подключается к ORM моделью без управления схемой и отдаётся наружу обычным вьюсетом только на чтение.
Где спотыкаются
Ждут от представления ускорения. Оно не кэш и не индекс: медленный запрос останется медленным, просто переедет под другое имя. Ускоряет материализованное представление, но вместе с ним появляются задача обновления и окно устаревших данных.
Строят представления поверх представлений. Три слоя вложенности читаются легко, а планируются плохо: оптимизатор получает раздутое дерево запроса, и заканчивается это неожиданным полным сканированием таблицы под нагрузкой.
Превращают вьюсет в свалку. Фильтрация, проверка прав и расчёты оседают в классе, который должен только принимать запрос и отдавать ответ. Выборку задаёт метод получения набора объектов, правила проверяют классы прав, а расчёты живут в сервисном слое.