В чем разница view и таблицы в базе данных?
Что проверяют
Понимаете ли вы, что view это сохранённый запрос, а не отдельная копия данных, и как это влияет на проверку данных в тестах. Следом часто спрашивают про материализованное представление и про то, можно ли писать в view через INSERT.
Как отвечать
Начните с главного различия:
- таблица: физически хранит строки, у неё есть свои ограничения (
PRIMARY KEY,FOREIGN KEY,CHECK) и индексы; - view (представление): хранит только текст
SELECT. При каждом обращении база подставляет этот запрос в ваш и читает базовые таблицы, поэтому view всегда показывает актуальные данные; - материализованное представление: хранит результат запроса как таблицу. Читается быстро, но устаревает, пока его не обновят (в PostgreSQL командой
REFRESH MATERIALIZED VIEW).
Дальше про запись. Простое представление над одной таблицей без JOIN, GROUP BY, DISTINCT и агрегатов обычно обновляемое: UPDATE через него меняет строки исходной таблицы. С WITH CHECK OPTION база не даст записать через view строку, которая в него не попадёт. Сложные представления доступны только на чтение, если не добавить триггер INSTEAD OF.
Зачем view нужны: спрятать сложный JOIN, выдать права на view вместо таблицы и так скрыть лишние колонки и строки, дать отчётам стабильный интерфейс.
Для тестировщика это практический вопрос. Если отчёт или API читает из view, при проверке вы смотрите и в базовые таблицы, и в сам view: баг может сидеть в условии WHERE представления. С материализованным view надо знать, когда оно обновляется, иначе «данные не совпадают» окажется не багом, а ожиданием обновления.
Где спотыкаются
Говорят, что view «медленнее таблицы». Сам по себе обычный view ничего не стоит: планировщик разворачивает его в запрос. Медленным бывает запрос внутри.
Путают view и материализованное представление и удивляются, что свежая запись не видна в отчёте.
Не знают, что SELECT * в определении view в PostgreSQL раскрывается в список колонок в момент создания. Новая колонка таблицы в представлении сама не появится, его придётся пересоздать.