Skip to content

Latest commit

 

History

History
185 lines (123 loc) · 8.16 KB

File metadata and controls

185 lines (123 loc) · 8.16 KB
layout default
title 🧮 Что такое нормальные формы БД и зачем они нужны?
description
author Dvurechensky
date 2025-08-28
published true
tags
generics
C#

🧮 Что такое нормальные формы БД и зачем они нужны?

Typing SVG

Static Badge

✨ Оглавление

⬆ Вернуться к главной


1️⃣ Почему нормализация важна

Цель нормализации — структурировать данные так, чтобы избежать дублирования, обеспечить целостность и упростить поддержку.

Проблемы без нормализации:

  • Дублирование данных → лишнее место, риск расхождений.
  • Аномалии при вставке/обновлении/удалении (Insert/Update/Delete Anomalies).
  • Трудности при изменении структуры данных.

Примеры аномалий:

  • Insert anomaly — нельзя вставить нового клиента, если нет заказа, если таблица не разделена.
  • Update anomaly — нужно менять одно и то же поле в нескольких строках.
  • Delete anomaly — удаление заказа может случайно удалить данные о клиенте.

2️⃣ Нормальные формы (NF) и их смысл

1NF — Первая нормальная форма

Суть: каждая ячейка таблицы содержит только одно значение, таблица плоская.

  • Требования:

    • Нет повторяющихся групп.
    • Каждое поле атомарно.
  • Пример:

Плохо:
| Student | Courses        |
|---------|----------------|
| Alice   | Math, English  |

Хорошо:
| Student | Course  |
|---------|---------|
| Alice   | Math    |
| Alice   | English |
  • Каверзный момент: не все считают список значений «несоблюдением 1NF», но для SQL это нарушение.

2NF — Вторая нормальная форма

Суть: таблица в 1NF и все неключевые поля зависят полностью от первичного ключа, а не от его части.

  • Требования:

    • Таблица в 1NF.
    • Нет частичных зависимостей (если ключ составной).
  • Пример:

Плохо:
| OrderID | ProductID | ProductName | Quantity |
|---------|-----------|-------------|---------|

ProductName зависит только от ProductID, а не от всего ключа (OrderID+ProductID) → нарушение 2NF

Хорошо:
OrderDetails:
| OrderID | ProductID | Quantity |

Products:
| ProductID | ProductName |
  • Каверзный момент: многие забывают про составной ключ и считают, что 2NF это просто удаление дублирования.

3NF — Третья нормальная форма

Суть: таблица в 2NF и нет транзитивных зависимостей (неключевые поля не зависят друг от друга).

  • Пример:
Плохо:
| StudentID | DeptID | DeptName |

DeptName зависит от DeptID, который не является ключом таблицы → транзитивная зависимость

Хорошо:
Students:
| StudentID | DeptID |

Departments:
| DeptID | DeptName |
  • Каверзный момент: иногда 3NF путают с 2NF. 2NF решает частичные зависимости, 3NF — транзитивные.

BCNF — Бойс-Кодд нормальная форма

Суть: сильная версия 3NF, все детерминанты — ключи.

  • Каверзный момент: редкие примеры, когда 3NF соблюдена, но BCNF нарушена. Например, таблица с двумя кандидатными ключами и зависимостью одного от другого.

4NF — Четвёртая нормальная форма

Суть: нет многозначных зависимостей (multi-valued dependencies).

  • Пример: студент может изучать несколько курсов и иметь несколько хобби. Если хранить всё в одной таблице, возникают дублирования комбинаций (курсы × хобби).

5NF — Пятая нормальная форма

Суть: нет избыточных данных из-за соединений (join dependencies).

  • Пример: сложные связи между таблицами, которые нельзя разделить без потери информации.

6NF — Шестая нормальная форма

  • Используется редко, чаще для Data Warehousing.
  • Таблица разложена до атомарных событий/значений.
  • В основном интересна для OLAP систем.

3️⃣ Зачем нормальные формы нужны на практике

  • Упрощают поддержку и изменение БД.
  • Обеспечивают целостность данных.
  • Уменьшают дублирование и размер базы.
  • Позволяют оптимизировать индексы и запросы, если не переборщить с нормализацией.
  • Каверзный момент: слишком строгая нормализация → большое количество JOIN → медленные SELECT-запросы → иногда используют денормализацию для чтения.

⬆ Вернуться к главной

✨Dvurechensky✨