| layout | default | ||
|---|---|---|---|
| title | 🧮 Что такое нормальные формы БД и зачем они нужны? | ||
| description | |||
| author | Dvurechensky | ||
| date | 2025-08-28 | ||
| published | true | ||
| tags |
|
- ✨ Оглавление
Цель нормализации — структурировать данные так, чтобы избежать дублирования, обеспечить целостность и упростить поддержку.
Проблемы без нормализации:
- Дублирование данных → лишнее место, риск расхождений.
- Аномалии при вставке/обновлении/удалении (Insert/Update/Delete Anomalies).
- Трудности при изменении структуры данных.
Примеры аномалий:
- Insert anomaly — нельзя вставить нового клиента, если нет заказа, если таблица не разделена.
- Update anomaly — нужно менять одно и то же поле в нескольких строках.
- Delete anomaly — удаление заказа может случайно удалить данные о клиенте.
Суть: каждая ячейка таблицы содержит только одно значение, таблица плоская.
-
Требования:
- Нет повторяющихся групп.
- Каждое поле атомарно.
-
Пример:
Плохо:
| Student | Courses |
|---------|----------------|
| Alice | Math, English |
Хорошо:
| Student | Course |
|---------|---------|
| Alice | Math |
| Alice | English |
- Каверзный момент: не все считают список значений «несоблюдением 1NF», но для SQL это нарушение.
Суть: таблица в 1NF и все неключевые поля зависят полностью от первичного ключа, а не от его части.
-
Требования:
- Таблица в 1NF.
- Нет частичных зависимостей (если ключ составной).
-
Пример:
Плохо:
| OrderID | ProductID | ProductName | Quantity |
|---------|-----------|-------------|---------|
ProductName зависит только от ProductID, а не от всего ключа (OrderID+ProductID) → нарушение 2NF
Хорошо:
OrderDetails:
| OrderID | ProductID | Quantity |
Products:
| ProductID | ProductName |
- Каверзный момент: многие забывают про составной ключ и считают, что 2NF это просто удаление дублирования.
Суть: таблица в 2NF и нет транзитивных зависимостей (неключевые поля не зависят друг от друга).
- Пример:
Плохо:
| StudentID | DeptID | DeptName |
DeptName зависит от DeptID, который не является ключом таблицы → транзитивная зависимость
Хорошо:
Students:
| StudentID | DeptID |
Departments:
| DeptID | DeptName |
- Каверзный момент: иногда 3NF путают с 2NF. 2NF решает частичные зависимости, 3NF — транзитивные.
Суть: сильная версия 3NF, все детерминанты — ключи.
- Каверзный момент: редкие примеры, когда 3NF соблюдена, но BCNF нарушена. Например, таблица с двумя кандидатными ключами и зависимостью одного от другого.
Суть: нет многозначных зависимостей (multi-valued dependencies).
- Пример: студент может изучать несколько курсов и иметь несколько хобби. Если хранить всё в одной таблице, возникают дублирования комбинаций (курсы × хобби).
Суть: нет избыточных данных из-за соединений (join dependencies).
- Пример: сложные связи между таблицами, которые нельзя разделить без потери информации.
- Используется редко, чаще для Data Warehousing.
- Таблица разложена до атомарных событий/значений.
- В основном интересна для OLAP систем.
- Упрощают поддержку и изменение БД.
- Обеспечивают целостность данных.
- Уменьшают дублирование и размер базы.
- Позволяют оптимизировать индексы и запросы, если не переборщить с нормализацией.
- Каверзный момент: слишком строгая нормализация → большое количество JOIN → медленные SELECT-запросы → иногда используют денормализацию для чтения.
✨Dvurechensky✨