Занятие 21. Взаимосвязи между таблицами. ER-диаграмма
⚡ Кратко: суть темы
Таблицы связаны через ключи. Три типа связей: 1:1, 1:N, M:N. ER-диаграмма визуализирует сущности, атрибуты и связи.
- Первичный ключ — уникален, не NULL.
- Внешний ключ — ссылка на первичный ключ другой таблицы.
- M:N требует промежуточной таблицы.
📖 Зачем хранить данные в разных таблицах
- Избежание дублирования. Информация о клиенте хранится один раз, а не в каждом заказе.
- Удобство управления. Обновить адрес клиента нужно только в одной таблице.
- Целостность данных. Связи и ограничения не позволяют создать заказ для несуществующего клиента.
📖 Типы связей
| Тип связи | Описание | Пример |
|---|---|---|
| Один к одному (1:1) | Каждой записи в одной таблице соответствует не более одной записи в другой | employees ↔ employee_details |
| Один ко многим (1:N) | Одной записи в одной таблице соответствует несколько записей в другой | customers → orders |
| Многие ко многим (M:N) | Записям в обеих таблицах соответствуют несколько записей друг друга | orders ↔ products через order_details |
📖 Ключи для связи таблиц
Первичный ключ (Primary Key, PK)
- Уникально идентифицирует каждую строку таблицы.
- Не допускает
NULL. - Обычно не изменяется.
CREATE TABLE customers (
id INT PRIMARY KEY,
company_name VARCHAR(255)
);
Внешний ключ (Foreign Key, FK)
- Связывает таблицу с первичным ключом другой таблицы.
- Обеспечивает ссылочную целостность.
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
📖 ER-диаграммы
ER-диаграмма (Entity-Relationship Diagram) — графическое представление структуры базы данных. Основные элементы:
- Сущности — прямоугольники, обычно соответствуют таблицам.
- Атрибуты — свойства сущностей (столбцы таблицы).
- Связи — линии между сущностями с указанием типа связи.
Нотация Crow's Foot
| Символ | Значение |
|---|---|
| | | Один |
| ○ | Ноль |
| ├─< | Много (три линии — «crow's foot») |
📖 Пример: схема northwind
customers(PK:id) — таблица клиентов.orders(PK:id, FK:customer_id→ customers) — заказы клиентов.products(PK:id) — товары.order_details(FK:order_id→ orders, FK:product_id→ products) — строки заказов.
Связи: customers 1:N orders; orders M:N products через order_details.
✨ Современные практики
- Используйте суррогатные целочисленные первичные ключи (
id) вместо естественных. - Явно задавайте внешние ключи и правила
ON DELETE/ON UPDATE. - Документируйте схему через ER-диаграмму до начала разработки.