← Назад к вопросам

Зачем нужна нормализация БД?

2.0 Middle🔥 241 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужна нормализация БД

Нормализация базы данных — это процесс структурирования и организации данных в реляционной БД для минимизации избыточности, улучшения целостности и эффективности запросов. Это фундаментальный принцип проектирования реляционных БД, введённый Эдгаром Коддом в 1970-х годах.

Основные причины нормализации

1. Исключение дублирования данных (Redundancy)

Одна из главных проблем ненормализованной БД — дублирование данных, что занимает больше места и создаёт проблемы с консистентностью.

# Ненормализованная таблица (сохраняются все данные в одной таблице)
ORDERS = [
    {
        "order_id": 1,
        "customer_name": "Иван Петров",
        "customer_email": "ivan@example.com",
        "customer_phone": "+7-900-123-45-67",
        "product_name": "Ноутбук",
        "product_price": 50000,
        "product_category": "Electronics",
        "quantity": 1,
        "total": 50000
    },
    {
        "order_id": 2,
        "customer_name": "Иван Петров",
        "customer_email": "ivan@example.com",
        "customer_phone": "+7-900-123-45-67",
        "product_name": "Мышка",
        "product_price": 500,
        "product_category": "Accessories",
        "quantity": 2,
        "total": 1000
    }
]

Если Иван сменит email на 5 заказах, нужно обновить 5 строк. А если забыть на одной — данные становятся несогласованными.

2. Улучшение целостности данных (Data Integrity)

Нормализация гарантирует, что данные всегда корректны и согласованы.

# Нормализованная схема
# Таблица CUSTOMERS
CUSTOMERS = [
    {"customer_id": 1, "name": "Иван Петров", "email": "ivan@example.com", "phone": "+7-900-123-45-67"},
    {"customer_id": 2, "name": "Мария Сидорова", "email": "maria@example.com", "phone": "+7-900-234-56-78"}
]

# Таблица PRODUCTS
PRODUCTS = [
    {"product_id": 1, "name": "Ноутбук", "price": 50000, "category": "Electronics"},
    {"product_id": 2, "name": "Мышка", "price": 500, "category": "Accessories"}
]

# Таблица ORDERS
ORDERS = [
    {"order_id": 1, "customer_id": 1, "product_id": 1, "quantity": 1},
    {"order_id": 2, "customer_id": 1, "product_id": 2, "quantity": 2}
]

# Теперь email Ивана хранится в одном месте!

3. Уменьшение пространства на диске

Дублирование данных занимает значительно больше места:

# Если в каждом заказе повторяется информация о клиенте (100 байт),
# и у клиента 1000 заказов, то дублирование займёт 100 KB только на одного клиента

# После нормализации данные клиента хранятся один раз
# Экономия памяти = огромная!

Нормальные формы (Normal Forms)

Нормализация проходит несколько уровней, называемых нормальными формами:

1НФ (First Normal Form)

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

# Нарушает 1НФ (повторяющаяся группа)
UNNORMALIZED = [
    {"customer_id": 1, "name": "Иван", "phone_numbers": ["123", "456", "789"]}
]

# Соответствует 1НФ
CUSTOMER = [{"customer_id": 1, "name": "Иван"}]
PHONES = [
    {"phone_id": 1, "customer_id": 1, "phone": "123"},
    {"phone_id": 2, "customer_id": 1, "phone": "456"},
    {"phone_id": 3, "customer_id": 1, "phone": "789"}
]

2НФ (Second Normal Form)

Полнота функциональной зависимости: каждый неключевой атрибут зависит ОТ ВСЕГО составного ключа, а не от его части.

# Нарушает 2НФ (student_phone зависит только от student_id)
STUDENT_COURSES = [
    {"student_id": 1, "course_id": 101, "student_phone": "123-456"},
    {"student_id": 1, "course_id": 102, "student_phone": "123-456"}
]

# Соответствует 2НФ
STUDENTS = [{"student_id": 1, "student_phone": "123-456"}]
COURSES = [{"course_id": 101, "course_name": "Math"}]
ENROLLMENTS = [
    {"student_id": 1, "course_id": 101},
    {"student_id": 1, "course_id": 102}
]

3НФ (Third Normal Form)

Нет переходных зависимостей: неключевой атрибут не должен зависеть от другого неключевого атрибута.

# Нарушает 3НФ (city зависит от country_id)
CUSTOMERS = [
    {"customer_id": 1, "name": "Иван", "country": "Russia", "country_code": "RU"}
]

# Соответствует 3НФ
COUNTRIES = [{"country_code": "RU", "country_name": "Russia"}]
CUSTOMERS = [
    {"customer_id": 1, "name": "Иван", "country_code": "RU"}
]

Преимущества нормализации

# 1. Облегчает обновления
# Чтобы изменить email Ивана — обновляем ОДНУ запись, не 100

# 2. Минимизирует аномалии при вставке (Insertion Anomaly)
# Ненормализованная БД: нельзя добавить новый продукт без заказа
# Нормализованная: добавляем в PRODUCTS независимо

# 3. Минимизирует аномалии при удалении (Deletion Anomaly)
# Ненормализованная: удалив последний заказ, теряем информацию о клиенте
# Нормализованная: клиент остаётся в БД

# 4. Улучшает производительность (обычно)
# Меньше данных для сканирования, лучше индексирование

# 5. Облегчает запросы
# Логичная структура упрощает написание SQL

Пример: нормализация реального сценария

# Ненормализованная версия (All-in-One таблица)
BOOK_LIBRARY = [
    {
        "book_id": 1,
        "title": "Python для начинающих",
        "author_name": "Гвидо ван Россум",
        "author_email": "guido@python.org",
        "publisher_name": "O'Reilly",
        "publisher_city": "Себастополь",
        "isbn": "978-0596007974",
        "publication_year": 2009
    }
]

# Нормализованная версия (3НФ)
AUTHORS = [
    {"author_id": 1, "name": "Гвидо ван Россум", "email": "guido@python.org"}
]

PUBLISHERS = [
    {"publisher_id": 1, "name": "O'Reilly", "city": "Себастополь"}
]

BOOKS = [
    {
        "book_id": 1,
        "title": "Python для начинающих",
        "author_id": 1,
        "publisher_id": 1,
        "isbn": "978-0596007974",
        "publication_year": 2009
    }
]

Когда не следует полностью нормализовать

Иногда денормализация может быть полезна для производительности:

# В аналитике часто используют денормализованные таблицы
# для ускорения агрегирующих запросов (Data Warehouses)

# Кэширование агрегированных значений
SALES_SUMMARY = {
    "date": "2024-01-15",
    "total_sales": 500000,
    "number_of_orders": 1250,
    "avg_order_value": 400
}

Заключение

Нормализация БД — это основополагающий принцип проектирования, который:

  • Устраняет дублирование данных
  • Гарантирует целостность и консистентность
  • Упрощает обновления и запросы
  • Экономит дисковое пространство
  • Облегчает долгосрочное обслуживание

Хотя полная нормализация может иногда повредить производительность, это исключение, а не правило. В подавляющем большинстве случаев нормализация — это лучший выбор для здоровой БД.