Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Первая нормальная форма (1NF)
Первая нормальная форма (1NF) — это первое правило нормализации баз данных, которое требует, чтобы все значения в таблице были атомарными (неделимыми). Это означает, что в каждой ячейке таблицы может быть только одно значение, не коллекция или составное значение.
Основные требования 1NF
- Атомарность значений — каждое значение должно быть неделимым
- Нет массивов и коллекций — каждая ячейка содержит скалярное значение
- Уникальность колонок — нет повторяющихся групп
- Первичный ключ — каждая строка уникально идентифицирована
- Однородность данных — все значения в колонке одного типа
Пример нарушения 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 важна?
- Консистентность данных — упрощает валидацию
- Упрощение запросов — нет нужды парсить строки
- Производительность — индексы работают корректно
- Модификация данных — INSERT, UPDATE, DELETE становятся проще
- Основа для дальнейшей нормализации — без 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 гарантирует основную структурную корректность базы данных, упрощает запросы и обеспечивает надёжность хранения данных.