Реляционная модель данных
Play ITЗагрузка интерактивного демо…
Play ITЗагрузка интерактивного демо…
Математические основы
Реляционная модель данных (РМД) — логическая модель и прикладная теория для построения БД; опирается на теорию множеств и логику предикатов первого порядка. Эдгар Ф. Кодд сформулировал её в 1969–1970 годах; практическая проверка "насколько СУБД реляционна" — двенадцать правил Кодда.
РМД включает три составляющие:
- Структура — данные как набор отношений (relation), то есть подмножеств декартовых произведений доменов.
- Целостность — декларативные ограничения на домены, ключи и ссылки между отношениями.
- Манипуляция — реляционная алгебра (процедурные операторы) и реляционное исчисление (декларативные предикаты); SQL опирается на оба подхода.
Информационный принцип Кодда: всё содержимое БД задаётся только явными значениями в кортежах, без скрытых указателей между ячейками (в отличие от навигации в сетевых СУБД).
В интерфейсе СУБД отношение чаще показывают таблицей, но "таблица" — визуализация; в теории важны заголовок, тело и свойства множества кортежей — см. Теоретические основы.
relationship на ER-диаграмме ("покупатель размещает заказ") в SQL — внешний ключ и JOIN. Обзор терминов: Знакомство с БД. Далее: нормализация, DDL.
Фундаментальные понятия
- Домен — множество допустимых значений атрибута с заданным типом и семантикой (например, возраст: целые числа от 0 до 150).
- Атрибут — именованная характеристика кортежа, связанная с доменом. Имя уникально в пределах отношения.
- Кортеж — набор значений атрибутов; в таблице представлен строкой.
- Отношение — множество кортежей одной структуры; в таблице — набор строк с общим заголовком столбцов.
Свойства отношений
| Свойство | Смысл |
|---|---|
| Нет дубликатов кортежей | Отношение — множество, не мультимножество |
| Нет порядка строк | Позиция строки не несёт смысла |
| Нет порядка столбцов | Столбец идентифицируется именем, не позицией |
| Атомарность значений | Каждая ячейка — одно значение домена (связь с 1НФ) |
Ограничения целостности
Целостность БД — соответствие данных объявленным правилам; СУБД отклоняет нарушающие операции. Это неправдоподобные значения (отрицательный вес при CHECK (вес > 0)), а не гарантия истинности фактов в реальном мире.
- Сущностная целостность — первичный ключ не содержит
NULLи однозначно идентифицирует кортеж (потенциальный ключ). - Ссылочная целостность — внешний ключ ссылается на существующий ключ родительского отношения или равен
NULL(если разрешено); политикиON DELETE/ON UPDATE— в ER-модели. - Доменная целостность — значение соответствует типу и диапазону столбца.
- Пользовательские правила —
CHECK, триггеры, бизнес-логика на уровне БД.
Подробнее о синтаксисе: Ограничения целостности в SQL; классификация уровней — Теоретические основы.
Отношение на практике — таблица, ключи, связи
В интерфейсе СУБД отношение показывают таблицей: столбцы — атрибуты с типом, строки — кортежи (записи). Схема задаёт имена и ограничения; данные живут в строках.
| Элемент | В теории | В SQL / интерфейсе |
|---|---|---|
| Отношение | Множество кортежей одной структуры | Таблица |
| Атрибут | Именованная характеристика кортежа | Столбец |
| Кортеж | Одна запись фактов | Строка |
| Первичный ключ | Потенциальный ключ, выбранный для идентификации | PRIMARY KEY |
| Внешний ключ | Ссылка на ключ родительского отношения | FOREIGN KEY … REFERENCES |
SQL и базовые операции с данными
SQL (Structured Query Language) — стандартный язык доступа к реляционным СУБД. На уровне данных чаще всего выделяют четыре группы операций (иногда их называют CRUD):
| Операция | Типичные команды SQL | Смысл |
|---|---|---|
| Create | INSERT | Добавить новые строки |
| Read | SELECT | Прочитать строки по условию |
| Update | UPDATE | Изменить существующие значения |
| Delete | DELETE | Удалить строки |
Структуру (таблицы, ключи, индексы) описывают DDL (CREATE TABLE, ALTER TABLE) — см. DDL. Первые запросы на живой СУБД — Первые шаги с SQL.
Первичный ключ
Первичный ключ (PRIMARY KEY) однозначно идентифицирует строку в пределах таблицы: значения уникальны и не допускают NULL. СУБД обычно создаёт для него индекс, ускоряя поиск и соединения.
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100)
);
Ключ может быть составным — из нескольких столбцов, если ни один атрибут отдельно не идентифицирует кортеж (например, позиция заказа: (order_id, product_code)).
Естественный и суррогатный ключ
Естественный ключ — атрибут из предметной области, который уже уникален в реальности — ISBN книги, артикул товара, номер паспорта (если политика данных это допускает).
CREATE TABLE products (
product_code VARCHAR(20) PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50),
price DECIMAL(10, 2)
);
Суррогатный ключ — искусственный идентификатор (SERIAL, IDENTITY, UUID), не несущий смысла для бизнеса, но стабильный при смене "человеческих" реквизитов. На практике часто комбинируют: суррогатный id для связей внутри БД и уникальный естественный код для интеграций и отчётов.
Внешний ключ и ссылочная целостность
Внешний ключ (FOREIGN KEY) хранит ссылку на первичный (или уникальный) ключ родительской таблицы. СУБД не даст оставить "висячую" ссылку: заказ без существующего клиента, строка заказа без товара.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Политики при удалении и обновении родителя (CASCADE, RESTRICT, SET NULL) — в Entity Relationship.
Типы связей между отношениями
Связи на ER-диаграмме в реляционной схеме превращаются в ключи и дополнительные таблицы:
| Кардинальность | Пример | Типичная реализация |
|---|---|---|
| Один к одному (1:1) | Пользователь ↔ профиль | FK с UNIQUE в одной из таблиц или общий ключ |
| Один ко многим (1:N) | Клиент → заказы | FK customer_id в таблице orders |
| Многие ко многим (M:N) | Товар ↔ категория | Связующая таблица (junction): пары ключей обеих сторон |
Пример M:N через связующую таблицу:
CREATE TABLE category_product (
category_id INT NOT NULL REFERENCES categories(category_id),
product_id INT NOT NULL REFERENCES products(product_id),
PRIMARY KEY (category_id, product_id)
);
Кардинальность и именование FK — ER-модель; нормализация схемы — Нормализация данных.
JOIN — собрать распределённые данные в одну выборку
Факты разнесены по таблицам; JOIN соединяет строки по условию равенства ключей (чаще всего FK = PK родителя). Так получают отчёт "заказ + имя клиента + название товара" одним SELECT.
| Тип JOIN | Что попадает в результат |
|---|---|
| INNER | Только строки с совпадением в обеих таблицах |
| LEFT | Все строки левой таблицы; справа NULL, если пары нет |
| RIGHT | Все строки правой таблицы; слева NULL, если пары нет |
| FULL | Объединение LEFT и RIGHT (зависит от диалекта SQL) |
Подробно — четыре основных JOIN на одном примере, раздел Алиасы, JOIN и объединение таблиц с тренажёром.
Индекс и представление (VIEW)
Индекс — вспомогательная структура по значениям столбца (или их комбинации). Ускоряет WHERE и JOIN, но удорожает вставку и обновление. Первичный ключ индексируется автоматически; вторичные индексы задают явно (CREATE INDEX).
Представление (VIEW) — сохранённый SELECT, к которому обращаются как к таблице. Скрывает сложность запроса (несколько JOIN, фильтры) и ограничивает видимые столбцы для ролей. Материализованные представления кэшируют результат — глава о VIEW.
Пример проектирования — библиотека
Исходные требования — книги (ISBN, название, год), авторы (многие ко многим с книгами), выдачи читателям.
Сущности и ключи
Учебная схема; DDL в стиле PostgreSQL (SERIAL, TEXT). Другие СУБД — справочник диалектов.
Код ITЗагрузка примера кода…
Декомпозиция связи "многие-ко-многим" через таблицу book_authors — стандартный приём реляционного проектирования.
Контрольные вопросы
- Почему отношение не допускает дублирующих кортежей, а таблица в Excel — допускает?
- Как отсутствие внутреннего порядка атрибутов влияет на формулировку SQL-запросов?
- Почему внешний ключ может быть
NULL, а первичный — нет? - Как атомарность значений связана с первой нормальной формой?
См. также
- Entity Relationship — ER и кардинальность
- Алиасы, JOIN и объединение таблиц
- SQL — реальные кейсы — запросы на связанных таблицах магазина после теории ключей
- Проектирование баз данных
- Двенадцать правил Кодда
- Нормализация данных
- DDL — определение структуры
- Эволюция систем хранения данных