Сильная (независимая) сущность существует автономно и обладает собственным первичным ключом, не зависящим от других объектов системы (например, Клиент, Актер, Товар, Режиссер).
INT / BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY) либо естественный ключ.UNIQUE NOT NULL.FOREIGN KEY NOT NULL.PRIMARY KEY (id_roditelya, nomer_pozicii).ON DELETE CASCADE.CREATE TABLE abonementy (
id_abonementa INT GENERATED ALWAYS AS IDENTITY,
id_klienta INT NOT NULL
REFERENCES klienty(id_klienta)
ON DELETE CASCADE,
tip_karty VARCHAR(50) NOT NULL,
PRIMARY KEY (id_abonementa)
);
Отношение «Один-к-одному» встречается при разделении частых и редких атрибутов, обеспечении безопасности или связи профиля с корзиной покупок.
Внешний ключ помещается в подчиненную таблицу и объявляется уникальным:
CREATE TABLE pasporta (
id_pasporta INT PRIMARY KEY,
seriya_nomer VARCHAR(20) NOT NULL UNIQUE,
id_grazhdanina INT NOT NULL UNIQUE
REFERENCES grazhdane(id)
);
Первичный ключ дочерней таблицы одновременно является внешним ключом (идеально для Корзины):
CREATE TABLE korziny (
id_pokupatelya INT PRIMARY KEY
REFERENCES pokupateli(id)
ON DELETE CASCADE,
obnovleno TIMESTAMP NOT NULL
);
Содержит первичный ключ и не знает о дочерних строках:
CREATE TABLE rezhissery (
id_rezhissera INT PRIMARY KEY,
fio VARCHAR(120) NOT NULL
);
Получает ссылку на родителя:
CREATE TABLE filmy (
id_filma INT PRIMARY KEY,
nazvanie VARCHAR(150) NOT NULL,
id_rezhissera INT NOT NULL
REFERENCES rezhissery(id_rezhissera)
ON DELETE RESTRICT
);
⚠️ Типовая ошибка: Попытка поместить ID фильма в строку режиссера — это ограничит режиссера ровно одним фильмом!
В концептуальной модели связь M:N естественна: Актеры снимаются во множестве Фильмов, Заказы содержат множество Блюд.
"1, 5, 23" в ячейке.Отношение M:N строго декомпозируется на две связи 1:M через введение третьей — промежуточной (ассоциативной) таблицы.
Ассоциативная таблица (Junction / Bridge table) объединяет сущности и хранит специфические атрибуты пересечения:
CREATE TABLE film_akter (
id_filma INT NOT NULL REFERENCES filmy(id_filma) ON DELETE CASCADE,
id_aktera INT NOT NULL REFERENCES aktery(id_aktera) ON DELETE RESTRICT,
rol_personazh VARCHAR(120) NOT NULL,
is_glavnaya BOOLEAN NOT NULL DEFAULT FALSE,
gonorar NUMERIC(12,2) CHECK (gonorar >= 0),
PRIMARY KEY (id_filma, id_aktera, rol_personazh)
);
Две колонки ссылаются на первичные ключи исходных сущностей.
Комбинация внешних ключей и роли исключает дублирование записей.
Поля, которые не принадлежат ни фильму отдельно, ни актеру отдельно.
Где хранить цену блюда?
blyuda — хранится текущая цена в меню.poziciya_zakaza — хранится цена на момент заказа!Где хранить роль персонажа?
| Политика | Механизм действия | Сфера применения |
|---|---|---|
| ON DELETE RESTRICT | Блокирует удаление родителя при наличии дочерних строк. | Мастер-справочники, клиенты, авторы, врачи, товары (защита архивов). |
| ON DELETE CASCADE | Автоматически уничтожает дочерние строки вслед за родителем. | Связующие таблицы M:N, строки корзины, вложенные позиции черновика заказа. |
| ON DELETE SET NULL | Устанавливает FK в NULL при удалении родительской записи. | Необязательные связи (промокод со скидкой, куратор группы). |
PRIMARY KEY (id_zakaza, id_blyuda)
Плюсы: Нулевой оверхед по памяти; СУБД физически гарантирует невозможность добавления дубликата одной и той же пары.
Минусы: Сложнее ссылаться из других таблиц (если потребуются внешние ключи на саму строку позиции).
id_pozicii BIGINT PRIMARY KEY, UNIQUE (id_zakaza, id_blyuda)
Плюсы: Простой компактный идентификатор для дочерних спецификаций и REST API.
Требование: Ограничение UNIQUE на связку внешних ключей СТРОГО обязательно!
FOREIGN KEY в таблицу на стороне «Многие».RESTRICT / CASCADE) и проверить совпадение типов FK и PK.Студент пытается записать список кодов в текстовую строку VARCHAR. База теряет атомарность, индексы перестают работать, поиск парализован.
Первичный ключ родителя объявлен как BIGINT, а внешний ключ дочерней таблицы — как INT или VARCHAR. СУБД возвращает ошибку DDL.
Цена чека помещена в общее меню блюд, а роль персонажа — в анкету актера. Нарушается логика предметной области и история операций.
ON DELETE RESTRICT.Robert'); DROP TABLE Students;--).