Реляционная модель данных: основные понятия

Реляционная модель данных - это математически строгий способ организовать информацию в таблицах так, чтобы исключить дублирование, обеспечить целостность и дать возможность делать сложные выборки одним запросом. Придуманная Эдгаром Коддом в 1970 году, она до сих пор лежит в основе большинства промышленных баз данных: PostgreSQL, MySQL, Oracle, SQLite. Чтобы понять, почему JOIN работает именно так и почему NULL - это особое значение, нужно разобраться с первичными понятиями: домен, атрибут, кортеж, отношение, ключ. Ниже - все эти понятия с примерами, а в калькуляторе можно почувствовать, как быстро растёт мощность декартова произведения при добавлении атрибутов.
Домен: множество допустимых значений
Домен - это именованное множество атомарных (неделимых) значений одного типа. Понятие «атомарный» здесь ключевое: значение в ячейке таблицы не должно само по себе быть списком или структурой - иначе первая нормальная форма нарушается.
Примеры доменов:
Возраст- целые числа от 0 до 150;ФИО- непустые строки длиной до 200 символов;Статус_заказа- перечисление:{новый, оплачен, отправлен, закрыт};Дата_рождения- даты в диапазоне от 1900-01-01 до сегодня.
Формально домен - это набор значений , а мощность домена - это количество различных значений, которые может принимать атрибут. Чем больше , тем больше потенциальных кортежей может существовать в отношении.
Атрибут, кортеж и схема отношения
Атрибут - это именованный столбец таблицы, значения которого берутся из конкретного домена. Атрибут определяет тип данных через пару . Один и тот же домен может использоваться несколькими атрибутами: например, атрибуты Город_проживания и Город_рождения оба берутся из домена Город, но это два разных атрибута.
Схема отношения - это заголовок таблицы: упорядоченный список атрибутов с их доменами. Число атрибутов называется степенью отношения (degree или arity). Отношение степени 1 - унарное, степени 2 - бинарное, и так далее.
Кортеж (tuple) - одна строка данных, соответствующая схеме: конкретный набор значений , где каждое принадлежит домену атрибута .
Отношение - это конечное множество кортежей, удовлетворяющих схеме . Именно множество - поэтому в отношении не бывает двух одинаковых кортежей и порядок строк не определён. Мощность отношения (cardinality) - это текущее число кортежей .

Декартово произведение и его мощность
Множество всех теоретически возможных кортежей длиной - это декартово произведение доменов:
Его мощность:
Если все домены одинаковы по мощности , то потенциал равен . При и получаем уже 100 000 возможных строк; при - сто миллионов. Реальное отношение - лишь подмножество этого произведения, которое удовлетворяет бизнес-правилам (ограничениям целостности).
Ключи: первичный, суперключ и кандидат
Суперключ - любое подмножество атрибутов, значения которого однозначно идентифицируют кортеж в отношении. Суперключом является, например, вся схема целиком: два кортежа в отношении не совпадают, значит, их совокупность атрибутов точно уникальна.
Ключ-кандидат (candidate key) - минимальный суперключ: если убрать хотя бы один атрибут из него, уникальность нарушится. В таблице СТУДЕНТ(Номер_зачётки, ФИО, Email, Группа) кандидатами могут быть Номер_зачётки и Email по отдельности - оба уникальны и неделимы в этой роли.
Первичный ключ (primary key, PK) - один из кандидатов, выбранный администратором базы данных как основной идентификатор. По стандарту SQL он обязан быть NOT NULL и уникальным. Остальные кандидаты становятся альтернативными ключами (UNIQUE в SQL).
Внешний ключ (foreign key, FK) - атрибут или набор атрибутов в одной таблице, ссылающийся на первичный ключ другой. Именно внешние ключи реализуют связи между отношениями и обеспечивают ссылочную целостность: нельзя добавить заказ с несуществующим клиентом.
Реляционная алгебра: операции над отношениями
Эдгар Кодд предложил реляционную алгебру как замкнутое множество операций: результат каждой операции - снова отношение. Базовые операции:
- Выборка (selection, ): отбирает кортежи по условию. - аналог WHERE в SQL.
- Проекция (): оставляет только указанные атрибуты, удаляя дубли. - аналог SELECT без дублей.
- Декартово произведение (): комбинирует каждый кортеж первого отношения с каждым кортежем второго.
- Соединение (join, ): декартово произведение с условием равенства по общим атрибутам - именно то, что делает JOIN в SQL.
- Объединение (), пересечение (), разность (): множественные операции над совместимыми по схеме отношениями.
Реляционная полнота - главная идея: любой запрос, выразимый реляционной алгеброй, можно записать на SQL, и наоборот. Этим обеспечивается декларативность SQL: вы описываете что хотите, а СУБД сама выбирает план выполнения.
Нормальные формы и функциональные зависимости
Функциональная зависимость означает, что значение набора атрибутов однозначно определяет значение . Например, Номер_зачётки ФИО: зная номер, всегда знаем фамилию.
Нормализация - процесс приведения схемы к нормальным формам, устраняющим аномалии обновления, вставки и удаления:
- 1НФ: все значения атомарны (нет вложенных списков или структур).
- 2НФ: 1НФ + каждый неключевой атрибут полностью функционально зависит от первичного ключа (нет частичных зависимостей).
- 3НФ: 2НФ + нет транзитивных зависимостей: не допускается.
- НФБК (Бойса-Кодда): каждая нетривиальная функциональная зависимость - от суперключа.
Пример нарушения 2НФ: таблица ЗАКАЗ(Номер_заказа, Код_товара, Наименование_товара, Количество). Ключ - пара (Номер_заказа, Код_товара), но Наименование_товара зависит только от Код_товара - частичная зависимость. Решение: выделить таблицу ТОВАР(Код_товара, Наименование_товара).
Ограничения целостности
Реляционная модель поддерживает три вида ограничений:
- Целостность сущностей: первичный ключ не может содержать NULL. Каждая строка обязана иметь идентификатор.
- Ссылочная целостность: значение внешнего ключа либо совпадает со значением первичного ключа родительской таблицы, либо равно NULL (если связь необязательна). Никаких «висячих» ссылок.
- Ограничения домена: CHECK-условия и типы данных гарантируют, что в поле возраста не окажется отрицательное число.
NULL в реляционной модели - не ноль и не пустая строка, а маркер отсутствующего или неприменимого значения. Его особенность: любое сравнение с NULL даёт UNKNOWN, а не TRUE или FALSE, что влечёт трёхзначную логику в условиях WHERE.
Частые ошибки
- Путать мощность и степень. Степень - число атрибутов (столбцов, не меняется при добавлении строк). Мощность - число кортежей (строк, меняется при каждом INSERT/DELETE).
- Допускать NULL в первичном ключе. По определению PK обязан однозначно идентифицировать строку, а NULL - не значение. Это запрещено стандартом.
- Смешивать домен и тип данных. Тип данных (
VARCHAR(100)) - реализация домена в конкретной СУБД. Домен может дополнительно ограничивать тип:Возраст- этоINTEGERс CHECK>= 0 AND <= 150. - Считать порядок строк фиксированным. В реляционной модели строки не упорядочены. ORDER BY - инструкция представления, а не свойство отношения.
- Игнорировать частичные зависимости при составном ключе. Если ключ состоит из двух атрибутов, а неключевой атрибут зависит только от одного из них - это 2НФ-нарушение, которое порождает аномалии при обновлении.
FAQ
Чем отношение отличается от таблицы? Отношение - математический объект: множество кортежей без дублей и порядка. Таблица - физическое представление в СУБД: допускает дублирующиеся строки (без PK), поддерживает порядок строк через физическую запись. Таблица с PRIMARY KEY и без дублей - практически отношение; без этих ограничений - нет.
Почему нельзя хранить список в одной ячейке? Потому что нарушится 1НФ: значения перестанут быть атомарными. Тогда нельзя выбрать один элемент списка в WHERE без разбора строки, а реляционная алгебра теряет замкнутость. Для связи «один ко многим» правильный инструмент - отдельная таблица с внешним ключом.
Как выбрать первичный ключ, если ключей-кандидатов несколько? Предпочитают минимальный, стабильный (не меняется со временем) и простой (один атрибут лучше составного). Если оба кандидата нестабильны (ФИО меняется, Email тоже), вводят суррогатный ключ: автоинкрементное целое число, лишённое бизнес-смысла, но гарантированно уникальное.
Коротко
Реляционная модель строится на трёх понятиях: домен (множество допустимых значений), атрибут (именованный столбец над доменом) и кортеж (строка данных). Отношение - конечное множество кортежей; его степень - число атрибутов, мощность - число строк. Первичный ключ однозначно идентифицирует кортеж, внешний ключ связывает отношения. Нормализация устраняет избыточность через функциональные зависимости. Вся эта система даёт SQL его декларативность: СУБД оптимизирует план запроса, опираясь именно на реляционную алгебру.
Читайте также

Функциональная зависимость в базе данных: разбор
Функциональная зависимость в базе данных простыми словами: запись X → Y, виды зависимостей, аксиомы Армстронга, замыкание атрибутов и роль ФЗ в нормализации и поиске ключей.

Хранимые процедуры в базе данных: зачем нужны и как писать
Хранимые процедуры в базе данных простыми словами: что это, синтаксис CREATE PROCEDURE, параметры IN OUT, отличие от функций и триггеров, плюсы и минусы, примеры на SQL.

Нормальная форма Бойса-Кодда (БКНФ): детерминант суперключ
Нормальная форма Бойса-Кодда БКНФ простыми словами: чем БКНФ строже 3НФ, как проверить, что детерминант каждой зависимости является суперключом, и как декомпозировать таблицу до БКНФ.