Конспект лекции: Реляционная модель данных: таблицы и ограничения

Учебный конспект по дисциплине «ОП.08 Основы проектирования баз данных» для студентов СИЭУиП

1. Введение: рождение реляционной модели

В 1970 году британский ученый Эдгар Франк Кодд (сотрудник научно-исследовательской лаборатории IBM в Сан-Хосе) опубликовал статью под названием «A Relational Model of Data for Large Shared Data Banks» («Реляционная модель данных для больших разделяемых банков данных»). Эта публикация перевернула развитие информационных технологий и заложила стандарты, по которым функционирует мировая индустрия баз данных уже более 50 лет.

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

Ключевая идея реляционной модели:
Все данные в базе представляются исключительно в виде математических отношений (relations), которые пользователь воспринимает как привычные двумерные таблицы. Взаимосвязи между данными выражаются не скрытыми дисковыми указателями, а равенством значений общих атрибутов.

2. Терминологический мост: теория РМД vs практика SQL

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

+---------------------------------------------------------------------------------------------------+ | МАТЕМАТИЧЕСКАЯ МОДЕЛЬ vs ТАБЛИЧНАЯ МОДЕЛЬ SQL | +---------------------------------------------------------------------------------------------------+ | ТЕОРИЯ РМД (Э. Кодд) | ПРАКТИКА СУБД (SQL) | ОПРЕДЕЛЕНИЕ И ПРИМЕР | +-----------------------------+----------------------------+----------------------------------------+ | Отношение (Relation) | Таблица (Table) | Множество кортежей (напр. "Товары") | | Кортеж (Tuple) | Строка / Запись (Row) | Конкретный экземпляр объекта (1 строка)| | Атрибут (Attribute) | Столбец / Поле (Column) | Именованное свойство (напр. "price") | | Домен (Domain) | Тип данных + CHECK | Множество допустимых значений (INT>0) | | Арность / Степень (Degree) | Число столбцов таблицы | Количество атрибутов схемы ($n$) | | Кардинальность (Cardinality)| Число строк таблицы | Текущее количество кортежей в таблице | | Заголовок (Heading) | Структура таблицы (DDL) | Схема: имена и типы колонок | | Тело отношения (Body) | Содержимое данных | Текущий набор записей таблицы | +---------------------------------------------------------------------------------------------------+

🏛 Заголовок и тело отношения

Заголовок (Heading): фиксированное множество пар «Атрибут : Домен». Это скелет отношения, определяемый командой CREATE TABLE.

Тело (Body): динамическое множество кортежей, подчиняющихся заголовку. Тело изменяется при выполнении команд INSERT, UPDATE, DELETE.

📐 Арность и кардинальность

Арность ($n$): число столбцов. Отношение из 4 столбцов называется 4-арным (тетрарным). Арность статична.

Кардинальность ($m$): число строк. Если на складе 500 товаров, кардинальность таблицы «Товары» равна 500. При удалении товара кардинальность уменьшается.

3. Четыре фундаментальных свойства отношений

Отношение не является произвольной сеткой ячеек. Будучи математическим множеством, оно обязано строго удовлетворять 4 аксиоматическим свойствам:

1. Уникальность кортежей

В теле отношения не может существовать двух абсолютно одинаковых кортежей. В математике множество $\{a, b, a\}$ эквивалентно множеству $\{a, b\}$. Отсюда вытекает железное правило: у каждого отношения обязан существовать хотя бы один первичный ключ (Primary Key).

2. Отсутствие порядка строк

Кортежи не упорядочены. В реляционной теории нет понятия «первая строка» или «предыдущая запись». Порядок строк при выборке без явного указания предложения ORDER BY не гарантирован ядром СУБД.

3. Отсутствие порядка столбцов

Атрибуты отношения не нумеруются слева направо. Они адресуются строго по уникальным именам. Заголовки $(A, B)$ и $(B, A)$ задают одно и то же отношение.

4. Атомарность значений (1НФ)

Значения всех атрибутов должны быть скалярными (неделимыми). В ячейке запрещено хранить списки, перечисления через запятую или вложенные таблицы. Это фундаментальное требование Первой нормальной формы (1NF).

4. Ограничения целостности (Integrity Constraints)

Ограничения целостности — это декларируемые бизнес-правила и предикаты, за соблюдением которых непрерывно следит ядро СУБД. Они гарантируют, что в базе никогда не появятся противоречивые, некорректные или мусорные данные.

4.1. Целостность сущности (Entity Integrity)

Определение: Ни один атрибут, входящий в состав первичного ключа (Primary Key), не может принимать значение NULL, а само значение первичного ключа должно быть уникальным для каждого кортежа.

Первичный ключ идентифицирует строку в физическом мире. Нельзя идентифицировать товар, если его артикул «неизвестен» (NULL) или если двум разным товарам присвоен одинаковый код.

4.2. Ссылочная целостность (Referential Integrity)

Определение: Внешний ключ (Foreign Key) дочерней таблицы должен ссылаться на существующее значение первичного (или уникального) ключа в родительской таблице, либо иметь значение NULL.

Ссылочная целостность защищает от появления «висячих строк» (orphans). Например, запрещено выписать рецепт на пациента с patient_id = 999, если пациента с таким номером нет в таблице Пациенты.

+---------------------------------------------------------------------------------------------------+ | ПРАВИЛА ОБРАБОТКИ ССЫЛОЧНОЙ ЦЕЛОСТНОСТИ | +---------------------------------------------------------------------------------------------------+ | ОПЦИЯ | ПОВЕДЕНИЕ СУБД ПРИ УДАЛЕНИИ РОДИТЕЛЬСКОЙ ЗАПИСИ (ON DELETE) | +---------------------+-----------------------------------------------------------------------------+ | RESTRICT / NO ACTION| ЗАПРЕТ: СУБД выдает ошибку и блокирует удаление родителя, если есть потомки.| | CASCADE | КАСКАД: СУБД автоматически удаляет все связанные строки в дочерней таблице. | | SET NULL | ОБНУЛЕНИЕ: Внешний ключ в дочерних строках становится NULL. | | SET DEFAULT | ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ: Внешний ключ принимает дефолтное значение. | +---------------------------------------------------------------------------------------------------+

4.3. Семантическая целостность и ограничение CHECK

Ограничение 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)

5. Практический пример: связывание двух отношений на SQL

Рассмотрим классический пример предметной области «Складской комплекс», состоящий из родительской таблицы Товары и дочерней таблицы Складские_остатки:

-- 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)
);

6. Вопросы для глубокой самопроверки

  1. В чем разница между степенью (арностью) и кардинальностью (мощностью) отношения?

    Какая из этих характеристик является статической при проектировании, а какая постоянно меняется во время работы СУБД?

  2. Почему в теле истинного математического отношения кортежи не могут дублироваться?

    Какое ограничение реляционной СУБД реализует это фундаментальное свойство на практике?

  3. Что произойдет при попытке выполнить команду DELETE FROM products WHERE sku = 'CPU-99';, если для внешнего ключа задано правило ON DELETE RESTRICT, и на складе числится 5 процессоров этой модели?

    Какое сообщение об ошибке вернет СУБД и почему?

  4. Почему при проектировании внешнего ключа нельзя сослаться на поле «Фамилия_пациента» в таблице пациентов?

    Какому фундаментальному правилу адресации данных это противоречит?

  5. В чем принципиальная разница между естественным первичным ключом (напр. VIN автомобиля) и суррогатным первичным ключом (напр. auto_id)?

    Какие риски несет использование естественных ключей при изменении бизнес-процессов?