Открыть сервис

Виртуальные таблицы

Виртуальная таблица — это объект базы данных, который ведёт себя как обычная таблица, но не хранит данные физически. Вместо этого виртуальная таблица представляет собой сохранённый запрос (или набор запросов) к одной или нескольким таблицам базы данных, результаты которого динамически вычисляются при каждом обращении. Основное назначение виртуальных таблиц — упрощение доступа к данным, обеспечение безопасности (ограничение видимости данных для разных пользователей) и абстрагирование сложной структуры базы данных.

Определение и ключевые характеристики

Виртуальная таблица (часто называемая представлением или view) — это логическая таблица, которая не занимает физического пространства на диске для хранения данных, за исключением метаданных о самом запросе. При обращении к виртуальной таблице система управления базами данных (СУБД) выполняет хранящийся в ней запрос и возвращает результирующий набор строк, который выглядит как таблица. Основные характеристики:

  • Динамичность: данные в виртуальной таблице всегда актуальны, так как они извлекаются из исходных таблиц в момент выполнения запроса.
  • Неизменяемость (частичная): в большинстве случаев виртуальные таблицы доступны только для чтения. Однако некоторые СУБД поддерживают операции вставки, обновления и удаления через представления, если они удовлетворяют определённым условиям (например, представление основано на одной таблице без агрегации).
  • Абстракция: виртуальная таблица скрывает от пользователя сложные соединения (JOIN), подзапросы и фильтрацию, предоставляя упрощённый интерфейс.
  • Безопасность: позволяет ограничить доступ к конфиденциальным столбцам или строкам, предоставляя пользователям только необходимую часть данных.

История

Концепция виртуальных таблиц возникла в рамках реляционной модели данных, предложенной Эдгаром Коддом в 1970 году. В своей работе «A Relational Model of Data for Large Shared Data Banks» Кодд описал представления как способ обеспечения логической независимости данных. Первые коммерческие реализации появились в СУБД 1980-х годов, таких как Oracle (версия 2, 1979) и IBM DB2. В 1990-х годах стандарт SQL (ISO/IEC 9075) включил определение представлений (CREATE VIEW) как обязательный элемент языка. С развитием объектно-реляционных и NoSQL-систем виртуальные таблицы стали использоваться и в них, хотя с другими механизмами реализации (например, материализованные представления в MongoDB).

Классификация виртуальных таблиц

Виртуальные таблицы классифицируются по нескольким признакам.

По способу хранения данных

  • Обычные представления (non-materialized views): классический тип, данные не хранятся, а вычисляются при каждом запросе. Это основной тип виртуальных таблиц.
  • Материализованные представления (materialized views): данные физически сохраняются на диске и периодически обновляются. Такие представления используются для ускорения сложных запросов, особенно в системах аналитики (OLAP). Примеры: PostgreSQL, Oracle, Microsoft SQL Server.

По сложности запроса

  • Простые представления: основаны на одной таблице, не содержат агрегатных функций, GROUP BY, HAVING или подзапросов. Часто поддерживают операции изменения данных.
  • Сложные представления: используют несколько таблиц (JOIN), агрегацию, подзапросы, функции. Обычно доступны только для чтения.

По назначению

  • Представления безопасности: скрывают конфиденциальные столбцы (например, пароли, номера кредитных карт) или строки (например, только данные определённого отдела).
  • Представления для упрощения: объединяют несколько таблиц в одну логическую структуру, избавляя пользователя от написания сложных запросов.
  • Представления для отчётности: формируют агрегированные данные (суммы, средние значения) для аналитических отчётов.

Устройство и реализация

Виртуальная таблица создаётся с помощью оператора SQL CREATE VIEW. Синтаксис в общем виде:

``sql CREATE VIEW имя_представления AS SELECT столбцы FROM таблицы WHERE условия; ``

После создания представление можно использовать в запросах как обычную таблицу:

``sql SELECT * FROM имя_представления; ``

Внутренняя реализация зависит от СУБД. Обычно при создании представления система сохраняет его определение (текст запроса) в системном каталоге. При выполнении запроса к представлению оптимизатор запросов объединяет (или «разворачивает») запрос пользователя с определением представления, формируя единый план выполнения. В некоторых СУБД (например, Oracle) возможна оптимизация через «подстановку представления» (view merging), когда запрос к представлению встраивается в основной запрос для повышения производительности.

Материализованные представления, напротив, хранят результат запроса в виде физической таблицы. Для их обновления используются механизмы: полное перестроение (REFRESH MATERIALIZED VIEW) или инкрементальное обновление (если поддерживается).

Применение

Виртуальные таблицы широко используются в различных областях:

  • Корпоративные базы данных: для разграничения доступа к данным. Например, в системе управления персоналом создаётся представление Сотрудники_отдел_продаж, которое показывает только сотрудников соответствующего отдела, скрывая зарплаты других подразделений.
  • Аналитика и отчётность: материализованные представления ускоряют выполнение сложных агрегатных запросов в системах бизнес-аналитики (BI). Например, представление Продажи_по_месяцам может хранить сводку продаж за каждый месяц, обновляемую раз в сутки.
  • Веб-приложения: для упрощения работы с данными. Например, представление Пользователи_с_ролями объединяет таблицы users и roles, чтобы разработчики не писали JOIN каждый раз.
  • Миграция и рефакторинг: при изменении структуры базы данных (например, разделении одной таблицы на две) можно создать представление, которое имитирует старую структуру, чтобы не ломать существующие приложения.

Примеры

Пример 1: Простое представление для безопасности

Пусть есть таблица employees с полями id, name, salary, department. Создадим представление, которое скрывает зарплату:

``sql CREATE VIEW employees_public AS SELECT id, name, department FROM employees; ``

Теперь пользователи с доступом только к этому представлению не увидят зарплаты.

Пример 2: Сложное представление для отчётности

``sql CREATE VIEW sales_summary AS SELECT product_id, SUM(quantity) AS total_quantity, SUM(price * quantity) AS total_revenue FROM orders GROUP BY product_id; ``

Это представление можно использовать для быстрой генерации отчёта о продажах.

Пример 3: Материализованное представление (PostgreSQL)

``sql CREATE MATERIALIZED VIEW monthly_sales AS SELECT DATE_TRUNC('month', order_date) AS month, SUM(amount) AS total FROM orders GROUP BY month WITH DATA; ``

Обновление: REFRESH MATERIALIZED VIEW monthly_sales;

Критика и ограничения

Несмотря на полезность, виртуальные таблицы имеют недостатки:

  • Производительность: обычные представления могут замедлять запросы, так как каждый раз выполняется сложный запрос. Особенно это критично при вложенных представлениях (представление на основе другого представления).
  • Ограничения на изменение данных: большинство представлений не поддерживают операции INSERT, UPDATE, DELETE, особенно если они основаны на нескольких таблицах или содержат агрегацию.
  • Сложность отладки: при ошибках в запросе к представлению сложно понять, на каком этапе возникла проблема, особенно если представление многоуровневое.
  • Зависимость от структуры: изменение исходных таблиц (например, удаление столбца) может сделать представление неработоспособным.

Интересные факты

  • В стандарте SQL-92 представления были впервые стандартизированы как часть языка DDL (Data Definition Language).
  • В некоторых СУБД (например, MySQL) представления могут быть «обновляемыми» только если они соответствуют строгим правилам (например, не содержат DISTINCT, GROUP BY, UNION).
  • Материализованные представления активно используются в системах реального времени (например, в Apache Kafka для потоковой обработки данных) для обеспечения быстрого доступа к агрегированным данным.
  • В NoSQL-базах данных, таких как Couchbase, существуют аналоги — «представления» (views) на основе MapReduce, которые также являются виртуальными и вычисляются по запросу.

Источники

  • Codd, E. F. «A Relational Model of Data for Large Shared Data Banks». Communications of the ACM, 1970.
  • ISO/IEC 9075-1:2016 «Information technology — Database languages — SQL — Part 1: Framework».
  • Date, C. J. «An Introduction to Database Systems». 8th edition, Addison-Wesley, 2004.
  • Документация PostgreSQL: «CREATE VIEW» и «CREATE MATERIALIZED VIEW».
  • Документация Oracle Database: «Views».
  • Документация Microsoft SQL Server: «Views».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →