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

Производный столбец

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

Определение и сущность

Производный столбец представляет собой вычисляемое поле, которое не занимает место на диске для хранения своего значения. Его содержимое генерируется «на лету» при выполнении запроса к базе данных. Выражение для вычисления может включать арифметические операции, строковые функции, логические условия, а также ссылки на другие столбцы той же таблицы. Например, в таблице «Товары» со столбцами «Цена» и «НДС» производный столбец «Цена_с_НДС» может быть определён как Цена * (1 + НДС/100).

Ключевое отличие производного столбца от обычного заключается в том, что он не хранит данные, а только правило их вычисления. Это позволяет избежать избыточности данных и гарантирует согласованность: если изменится значение исходного столбца, производный столбец автоматически отразит это изменение при следующем обращении.

История и развитие

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

В 1990-х годах, с появлением стандарта SQL-92, некоторые СУБД начали внедрять поддержку вычисляемых столбцов непосредственно в определении таблицы. Первопроходцами стали коммерческие системы, такие как Microsoft SQL Server (с версии 7.0, 1998 год) и Oracle Database (с версии 8i, 1999 год). В этих реализациях производные столбцы могли быть как виртуальными (вычисляемыми при каждом чтении), так и материализованными (с сохранением результата на диске).

В 2000-х годах поддержка производных столбцов была добавлена в PostgreSQL (с версии 12, 2019 год), MySQL (с версии 5.7, 2015 год) и другие открытые СУБД. Развитие шло по пути расширения возможностей: появилась поддержка индексов на производных столбцах, функций, определённых пользователем, и оптимизация вычислений.

Классификация производных столбцов

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

  1. Виртуальные (виртуальные вычисляемые столбцы) — значения не хранятся на диске, а вычисляются при каждом чтении строки. Это экономит дисковое пространство, но увеличивает нагрузку на процессор при выполнении запросов. Поддерживаются в Oracle, PostgreSQL, MySQL.
  1. Материализованные (хранимые вычисляемые столбцы) — результат вычисления сохраняется на диске и обновляется при изменении исходных данных. Это ускоряет чтение, но требует дополнительного места и затрат на обновление при вставке или модификации строк. Поддерживаются в Microsoft SQL Server, MySQL (с версии 5.7).

По типу выражения

  1. Арифметические — используют математические операции (сложение, умножение, деление). Пример: Общая_сумма = Количество * Цена.
  1. Строковые — применяют функции конкатенации, форматирования или извлечения подстрок. Пример: Полное_имя = Фамилия || ' ' || Имя.
  1. Логические — возвращают булево значение на основе условий. Пример: Доступен = CASE WHEN Количество > 0 THEN 1 ELSE 0 END.
  1. Агрегатные — в некоторых СУБД (например, Oracle) поддерживаются производные столбцы, использующие оконные функции или агрегаты, хотя это редкость.

Реализация в различных СУБД

Microsoft SQL Server

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

``sql CREATE TABLE Товары ( ID INT PRIMARY KEY, Цена DECIMAL(10,2), НДС DECIMAL(5,2), Цена_с_НДС AS (Цена * (1 + НДС/100)) PERSISTED ); ``

Ключевое слово PERSISTED указывает на материализацию. Без него столбец остаётся виртуальным. На материализованные столбцы можно создавать индексы.

Oracle Database

Поддерживает виртуальные столбцы с версии 11g (2007 год). Синтаксис:

``sql CREATE TABLE Товары ( ID NUMBER PRIMARY KEY, Цена NUMBER(10,2), НДС NUMBER(5,2), Цена_с_НДС GENERATED ALWAYS AS (Цена * (1 + НДС/100)) VIRTUAL ); ``

Ключевое слово VIRTUAL является опциональным. В Oracle нельзя создавать индексы на виртуальные столбцы напрямую, но можно использовать функциональные индексы.

PostgreSQL

Поддерживает виртуальные столбцы с версии 12 (2019 год). Синтаксис:

``sql CREATE TABLE Товары ( ID SERIAL PRIMARY KEY, Цена NUMERIC(10,2), НДС NUMERIC(5,2), Цена_с_НДС NUMERIC(10,2) GENERATED ALWAYS AS (Цена * (1 + НДС/100)) STORED ); ``

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

MySQL

Поддерживает как виртуальные, так и материализованные столбцы с версии 5.7 (2015 год). Синтаксис:

``sql CREATE TABLE Товары ( ID INT PRIMARY KEY, Цена DECIMAL(10,2), НДС DECIMAL(5,2), Цена_с_НДС DECIMAL(10,2) GENERATED ALWAYS AS (Цена * (1 + НДС/100)) STORED ); ``

Ключевое слово STORED указывает на материализацию, VIRTUAL — на виртуальность (по умолчанию). На виртуальные столбцы можно создавать индексы.

Применение

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

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

Преимущества и недостатки

Преимущества

  • Устранение избыточности: данные не дублируются, что снижает риск рассинхронизации.
  • Автоматизация: вычисления выполняются СУБД, а не прикладным кодом.
  • Производительность: материализованные столбцы ускоряют чтение, а виртуальные экономят место.
  • Целостность: изменения исходных данных автоматически отражаются в производных.

Недостатки

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

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

  • В некоторых СУБД (например, SQLite) производные столбцы не поддерживаются, и их роль выполняют представления или триггеры.
  • Производные столбцы могут быть использованы для создания индексов на вычисляемых значениях, что позволяет ускорить поиск по сложным условиям.
  • В стандарте SQL:2016 производные столбцы определены как часть спецификации, но их реализация остаётся на усмотрение разработчиков СУБД.

Источники

  • Стандарт SQL:2016, раздел 11.4 «Column definition».
  • Документация Microsoft SQL Server: «Computed Columns».
  • Документация Oracle Database: «Virtual Columns».
  • Документация PostgreSQL: «Generated Columns».
  • Документация MySQL: «CREATE TABLE and Generated Columns».
  • К. Дж. Дейт, «Введение в системы баз данных», 8-е издание, 2004.

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

На главную BFOmetr →