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

Что значит первая нормальная форма?

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

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

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

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

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

Первая нормальная форма (1NF) — это первое правило нормализации баз данных, которое требует, чтобы все значения в таблице были атомарными (неделимыми). Это означает, что в каждой ячейке таблицы может быть только одно значение, не коллекция или составное значение.

Основные требования 1NF

  1. Атомарность значений — каждое значение должно быть неделимым
  2. Нет массивов и коллекций — каждая ячейка содержит скалярное значение
  3. Уникальность колонок — нет повторяющихся групп
  4. Первичный ключ — каждая строка уникально идентифицирована
  5. Однородность данных — все значения в колонке одного типа

Пример нарушения 1NF

// НЕПРАВИЛЬНО - нарушает 1NF
// Таблица Students
/*
student_id | name     | courses
-----------|----------|-----------------------------
1          | John     | Java, Python, C++
2          | Jane     | JavaScript, React, Node.js
3          | Bob      | SQL, Database Design
*/

// Проблема: поле courses содержит несколько значений,
// что нарушает атомарность

Правильная реализация 1NF

// ПРАВИЛЬНО - соответствует 1NF
// Таблица Students
/*
student_id | name
-----------|------
1          | John
2          | Jane
3          | Bob
*/

// Таблица StudentCourses
/*
student_id | course
-----------|----------
1          | Java
1          | Python
1          | C++
2          | JavaScript
2          | React
2          | Node.js
3          | SQL
3          | Database Design
*/

Еще примеры нарушения 1NF

// НЕПРАВИЛЬНО - вложенные структуры
student_id | name | address
-----------|------|-------------------------
1          | John | {street: 'Main', city: 'NYC'}

// НЕПРАВИЛЬНО - повторяющиеся группы
order_id | customer | phone1      | phone2      | phone3
---------|----------|-------------|-------------|--------
1        | John     | 123-456-789 | 987-654-321 | null

// НЕПРАВИЛЬНО - данные в одной ячейке
project_id | team_members
-----------|---------------------------
1          | John, Jane, Bob, Alice

SQL реализация 1NF

// Нарушение 1NF
CREATE TABLE projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(100),
    team_members VARCHAR(500)  -- НЕПРАВИЛЬНО: строка с разделителями
);

// Соответствие 1NF
CREATE TABLE projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(100)
);

CREATE TABLE project_members (
    project_id INT,
    member_id INT,
    PRIMARY KEY (project_id, member_id),
    FOREIGN KEY (project_id) REFERENCES projects(project_id)
);

Практический пример: товары и теги

// НЕПРАВИЛЬНО
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    tags VARCHAR(200)  -- "красный, большой, электроника"
);

// ПРАВИЛЬНО
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100)
);

CREATE TABLE product_tags (
    product_id INT,
    tag_id INT,
    PRIMARY KEY (product_id, tag_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id),
    FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);

CREATE TABLE tags (
    tag_id INT PRIMARY KEY,
    tag_name VARCHAR(50)
);

Почему 1NF важна?

  1. Консистентность данных — упрощает валидацию
  2. Упрощение запросов — нет нужды парсить строки
  3. Производительность — индексы работают корректно
  4. Модификация данных — INSERT, UPDATE, DELETE становятся проще
  5. Основа для дальнейшей нормализации — без 1NF невозможна 2NF и 3NF

Иерархия нормальных форм

1NF (Первая нормальная форма)
  ↓ Удаление частичных зависимостей
2NF (Вторая нормальная форма)
  ↓ Удаление транзитивных зависимостей
3NF (Третья нормальная форма)
  ↓ Бойса-Кодда нормальная форма (BCNF)
4NF, 5NF (редко используются)

Метод нормализации на примере

// Исходная таблица (ненормализованная)
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(100),
    department_info VARCHAR(300),  -- "IT, Building 5, Manager: Smith"
    skills VARCHAR(500)             -- "Java, SQL, Python"
);

// После применения 1NF
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(100),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(dept_id)
);

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(100),
    building INT,
    manager_id INT
);

CREATE TABLE employee_skills (
    emp_id INT,
    skill VARCHAR(100),
    PRIMARY KEY (emp_id, skill),
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);

Заключение

Первая нормальная форма — фундаментальный принцип проектирования БД. Она требует атомарности значений и исключает повторяющиеся группы. Соблюдение 1NF гарантирует основную структурную корректность базы данных, упрощает запросы и обеспечивает надёжность хранения данных.

Что значит первая нормальная форма? | PrepBro