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

Что такое нормализация базы данных?

1.0 Junior🔥 141 комментариев
#Теория тестирования

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

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

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

Что такое нормализация базы данных?

Нормализация базы данных — это процесс организации структуры реляционной базы данных в соответствии с набором определённых правил (так называемых нормальных форм). Его основная цель — устранение избыточности данных, минимизация аномалий при операциях вставки, обновления и удаления, а также обеспечение целостности и логической непротиворечивости данных. Как QA Automation Engineer, я часто сталкиваюсь с нормализованными базами данных при проверке работы приложений, написании интеграционных тестов или анализе данных для тестирования. Понимание нормализации критически важно для проектирования корректных тестовых сценариев и предсказания поведения системы.

Ключевые цели нормализации:

  • Устранение избыточности данных: Одни и те же данные не должны храниться в нескольких местах. Это экономит место и, что важнее, исключает риск рассинхронизации. Например, в ненормализованной таблице Заказы адрес клиента мог бы дублироваться для каждого его заказа, и при смене адреса пришлось бы обновлять все связанные записи.
  • Предотвращение аномалий:
    *   **Аномалии обновления:** Необходимость изменять одни и те же данные в нескольких строках (как в примере с адресом).
    *   **Аномалии удаления:** Удаление одной записи может повлечь нежелательную потерю другой информации (например, удаление последнего заказа клиента может стереть и сам факт его существования).
    *   **Аномалии добавления:** Невозможность добавить данные об одной сущности без наличия данных о другой (например, нельзя внести нового сотрудника, пока он не получит проект).
  • Обеспечение логической целостности: Данные организуются в логические сущности (таблицы), что делает структуру БД более понятной, гибкой и адаптируемой к изменениям.

Основные нормальные формы (НФ)

Процесс обычно идёт поэтапно, от первой нормальной формы к более высоким.

1. Первая нормальная форма (1НФ)

Таблица находится в 1НФ, если:

  • Все атрибуты атомарны (не составные и не множественные).
  • Все строки уникальны.
  • Каждое поле содержит значения одного типа.

Пример нарушения: Поле Телефоны со значением "89991112233, 89994445566". Приведение к 1НФ: Создаём отдельную таблицу для связи «многие-ко-многим».

-- Ненормализованная таблица (нарушение 1НФ)
CREATE TABLE Сотрудники (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    phones TEXT -- Нарушение: несколько телефонов в одном поле
);

-- Приводим к 1НФ
CREATE TABLE Сотрудники (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE Телефоны (
    id INT PRIMARY KEY,
    employee_id INT,
    phone_number VARCHAR(20),
    FOREIGN KEY (employee_id) REFERENCES Сотрудники(id)
);

2. Вторая нормальная форма (2НФ)

Таблица находится во 2НФ, если:

  • Она уже в 1НФ.
  • Все неключевые атрибуты полностью зависят от первичного ключа (в случае составного ключа — от всей его совокупности, а не от части).

Пример: В таблице Заказ_Детали (order_id, product_id, product_name, quantity) поле product_name зависит только от product_id, а не от всего ключа (order_id, product_id). Решение: Вынести product_name в отдельную таблицу Продукты.

3. Третья нормальная форма (3НФ)

Таблица находится в 3НФ, если:

  • Она уже в 2НФ.
  • Все неключевые атрибуты зависят только от первичного ключа и не имеют транзитивных зависимостей (т.е. не зависят друг от друга).

Пример: В таблице Сотрудники (id, name, department_id, department_location) поле department_location зависит от department_id, а не напрямую от id сотрудника. Решение: Вынести department_id и department_location в таблицу Отделы.

Денормализация в контексте автоматизации тестирования

В реальных проектах, особенно в системах с высокой нагрузкой (например, в data warehouses или read-heavy приложениях), часто применяется контролируемая денормализация — осознанное отступление от нормальных форм для увеличения скорости выполнения запросов за счёт избыточности. Для QA Automation Engineer это означает:

  1. Понимание схемы данных: Чтобы писать эффективные тесты, нужно знать, где и почему данные дублируются.
  2. Тестирование согласованности: Необходимо создавать проверки (например, в виде скриптов или в рамках E2E-тестов), которые убедятся, что денормализованные данные синхронизированы с исходными (мастер-данными).
  3. Производительность: Тесты, работающие с денормализованными таблицами, должны выполняться быстрее на операциях чтения.
# Пример проверки согласованности денормализованных данных в автотесте
def test_denormalized_data_consistency(self):
    # Берём ID заказа из основной (нормализованной) таблицы
    order_id = self.get_test_order_id()

    # Получаем данные из нормализованной схемы
    normalized_data = self.db_query("""
        SELECT c.name, o.total_amount
        FROM orders o
        JOIN customers c ON o.customer_id = c.id
        WHERE o.id = %s
    """, (order_id,))

    # Получаем данные из денормализованной таблицы (например, для отчётов)
    denormalized_data = self.db_query("""
        SELECT customer_name, total
        FROM orders_denormalized
        WHERE order_id = %s
    """, (order_id,))

    # Сравниваем ключевые поля
    assert normalized_data['name'] == denormalized_data['customer_name'], "Имена клиентов не совпадают!"
    assert normalized_data['total_amount'] == denormalized_data['total'], "Суммы заказа не совпадают!"
    self.logger.info("Проверка согласованности денормализованных данных пройдена.")

Вывод для QA Automation: Нормализация — это фундаментальный принцип проектирования БД, обеспечивающий целостность данных. Однако в высоконагруженных системах её часто жертвуют ради производительности. Задача автоматизатора — не только понимать эти концепции, но и уметь писать тесты, которые проверяют как логическую корректность (целостность связей, отсутствие аномалий), так и актуальность данных в условиях денормализации, используя соответствующие запросы и проверки в коде автотестов. Это напрямую влияет на надёжность проверяемого приложения.

Что такое нормализация базы данных? | PrepBro