Первая нормальная форма (далее – 1НФ)определяет ряд базовых правил организации базы данных (далее – БД):
- Определяет необходимые данные, которые становятся колонками таблицы. Размещает связанные по смыслу данные в таблице.
- Гарантирует, что в БД нет повторяющихся групп данных.
- Гарантирует, что каждая таблица содержит первичный ключ (primary Key).
Первое правило 1 НФ
Мы должны опредлить данные. Это означает, что данные должны быть сохранены, организованы по колонкам, определяя к какому констрейнту относится каждая колонка и размещение данных колонок в таблицы.
Например, мы размещаем колонки, которые относятся к специализации в таблице specialties, данные, которые относятся к разработчикам в таблице developers и т.д.
Второе правило 1 НФ
Мы должны гарантировать, что в БД нет повторяющихся групп данных. Предположим, у нас есть следующая таблица:
+–+——————————–+—————–+———–+
| id | name | specialty | salary |
+–+——————————–+—————–+———–+
Если мы начнём заполнять данную таблицу данными одного разработчика, который имеет несколько специальностей, это будет выглядеть следующим образом:
+–+——————————–+—————–+———–+
| id | name | specialty | salary |
+–+——————————–+—————–+———–+
| 1 | Eugene Suleimanov | Java | 2000 |
| 1 | Eugene Suleimanov | C++ | 2000 |
| 1 | Eugene Suleimanov | Javascript | 2000 |
+–+——————————–+—————–+———–+
Но, 1 НФ требует, чтобы у нас не было повторяющихся групп данных.
Поэтому, мы должны разбить таблицу на две:
- developers
CREATE TABLE developers( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, SALARY INT NOT NULL, PRIMARY KEY (ID) );
- specialties
CREATE TABLE specialties( ID INT NOT NULL, DEVELOPER_ID NOT NULL, SPECIALTY VARCHAR(100) NOT NULL, PRIMARY KEY (ID) );
Таблица specialties будет иметь следующий вид:
+–+——————————–+—————–+
| id |developer_id | specialty |
+–+——————————–+—————–+
| 10 | 1 | Java |
| 11 | 1 | C++ |
| 12 | 1 | Javascript |
+–+——————————–+—————–+
Третье правило 1НФ
Третье првило 1НФ гласит, что каждая создаваемая нами таблица должна содержать первичный ключ (primary key).