В 1970 году британский ученый Эдгар Франк Кодд (сотрудник научно-исследовательской лаборатории IBM в Сан-Хосе) опубликовал статью под названием «A Relational Model of Data for Large Shared Data Banks» («Реляционная модель данных для больших разделяемых банков данных»). Эта публикация перевернула развитие информационных технологий и заложила стандарты, по которым функционирует мировая индустрия баз данных уже более 50 лет.
До Кодда преобладали иерархические и сетевые СУБД. В них прикладной программист был вынужден знать физическую структуру файлов, расположение указателей на диске и алгоритмы обхода связей. Кодд применил строгий математический аппарат — теорию множеств и логику предикатов первого порядка, разделив логическое представление данных и их физическое хранилище на диске.
В академической теории реляционных баз данных и в промышленной разработке (SQL) для обозначения одних и тех же сущностей используются разные термины. Понимание точного соответствия критически важно для профессионального инженера.
Заголовок (Heading): фиксированное множество пар «Атрибут : Домен». Это скелет отношения, определяемый командой CREATE TABLE.
Тело (Body): динамическое множество кортежей, подчиняющихся заголовку. Тело изменяется при выполнении команд INSERT, UPDATE, DELETE.
Арность ($n$): число столбцов. Отношение из 4 столбцов называется 4-арным (тетрарным). Арность статична.
Кардинальность ($m$): число строк. Если на складе 500 товаров, кардинальность таблицы «Товары» равна 500. При удалении товара кардинальность уменьшается.
Отношение не является произвольной сеткой ячеек. Будучи математическим множеством, оно обязано строго удовлетворять 4 аксиоматическим свойствам:
В теле отношения не может существовать двух абсолютно одинаковых кортежей. В математике множество $\{a, b, a\}$ эквивалентно множеству $\{a, b\}$. Отсюда вытекает железное правило: у каждого отношения обязан существовать хотя бы один первичный ключ (Primary Key).
Кортежи не упорядочены. В реляционной теории нет понятия «первая строка» или «предыдущая запись». Порядок строк при выборке без явного указания предложения ORDER BY не гарантирован ядром СУБД.
Атрибуты отношения не нумеруются слева направо. Они адресуются строго по уникальным именам. Заголовки $(A, B)$ и $(B, A)$ задают одно и то же отношение.
Значения всех атрибутов должны быть скалярными (неделимыми). В ячейке запрещено хранить списки, перечисления через запятую или вложенные таблицы. Это фундаментальное требование Первой нормальной формы (1NF).
Ограничения целостности — это декларируемые бизнес-правила и предикаты, за соблюдением которых непрерывно следит ядро СУБД. Они гарантируют, что в базе никогда не появятся противоречивые, некорректные или мусорные данные.
NULL, а само значение первичного ключа должно быть уникальным для каждого кортежа.
Первичный ключ идентифицирует строку в физическом мире. Нельзя идентифицировать товар, если его артикул «неизвестен» (NULL) или если двум разным товарам присвоен одинаковый код.
NULL.
Ссылочная целостность защищает от появления «висячих строк» (orphans). Например, запрещено выписать рецепт на пациента с patient_id = 999, если пациента с таким номером нет в таблице Пациенты.
Ограничение CHECK позволяет задать предикатное правило проверки допустимых значений атрибута:
-- Ограничение на неотрицательный остаток на складе
quantity INT NOT NULL CHECK (quantity >= 0)
-- Ограничение на допустимый диапазон разовой дозировки лекарства
dosage_mg NUMERIC(6,2) NOT NULL CHECK (dosage_mg > 0 AND dosage_mg <= 500)
-- Ограничение на балльно-рейтинговую оценку студента
score INT NOT NULL CHECK (score BETWEEN 0 AND 100)
Рассмотрим классический пример предметной области «Складской комплекс», состоящий из родительской таблицы Товары и дочерней таблицы Складские_остатки:
-- 1. Родительская таблица: Товары (целостность сущности)
CREATE TABLE products (
sku VARCHAR(20) PRIMARY KEY, -- Артикул: первичный естественный ключ
name VARCHAR(150) NOT NULL, -- Наименование товара
category VARCHAR(50) NOT NULL, -- Категория товара
unit_price NUMERIC(10,2) NOT NULL CHECK (unit_price > 0)
);
-- 2. Дочерняя таблица: Складские остатки (ссылочная и семантическая целостность)
CREATE TABLE inventory (
inventory_id SERIAL PRIMARY KEY, -- Суррогатный первичный ключ
sku VARCHAR(20) NOT NULL, -- Внешний ключ на товар
warehouse_zone VARCHAR(10) NOT NULL, -- Зона склада (напр. 'A-12')
quantity INT NOT NULL DEFAULT 0, -- Количество на хранении
reserved_qty INT NOT NULL DEFAULT 0, -- Зарезервировано под заказы
-- Ограничение ссылочной целостности: запрет удаления товара с остатками
CONSTRAINT fk_inventory_product FOREIGN KEY (sku)
REFERENCES products(sku)
ON DELETE RESTRICT
ON UPDATE CASCADE,
-- Ограничения семантической целостности (CHECK)
CONSTRAINT chk_positive_qty CHECK (quantity >= 0),
CONSTRAINT chk_reserved_valid CHECK (reserved_qty >= 0 AND reserved_qty <= quantity),
-- Уникальность размещения: один товар в одной зоне склада хранится единожды
CONSTRAINT uq_sku_zone UNIQUE (sku, warehouse_zone)
);
Какая из этих характеристик является статической при проектировании, а какая постоянно меняется во время работы СУБД?
Какое ограничение реляционной СУБД реализует это фундаментальное свойство на практике?
DELETE FROM products WHERE sku = 'CPU-99';, если для внешнего ключа задано правило ON DELETE RESTRICT, и на складе числится 5 процессоров этой модели?
Какое сообщение об ошибке вернет СУБД и почему?
Какому фундаментальному правилу адресации данных это противоречит?
Какие риски несет использование естественных ключей при изменении бизнес-процессов?