Sobes.tech
Назад к вопросам
Junior — Middle
49

Объясните, что подразумевается под первой нормальной формой в нормализации базы данных

Компании, где спрашивали
СБЕРСБЕР
СБЕР ТехСБЕР Тех

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

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

Пример использования:

Допустим, есть таблица пользователей:

-- Неправильно: несколько телефонов в одном поле
CREATE TABLE users_bad (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    phones VARCHAR(255)
);

INSERT INTO users_bad (id, name, phones)
VALUES (1, 'Иван', '+79990000001, +79990000002');

Такое хранение нарушает 1NF, потому что в одном поле лежит список значений. Лучше разнести телефоны в отдельную таблицу:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE user_phones (
    user_id INT,
    phone VARCHAR(20),
    PRIMARY KEY (user_id, phone),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

INSERT INTO users (id, name)
VALUES (1, 'Иван');

INSERT INTO user_phones (user_id, phone)
VALUES (1, '+79990000001'),
       (1, '+79990000002');

Теперь каждое значение атомарно, и с телефонами можно работать отдельно: искать, обновлять, удалять.

Пояснение кода:

В первом варианте поле phones содержит сразу несколько телефонов, разделённых запятой. Это неудобно для SQL-запросов: сложно выбрать конкретный телефон, проверить уникальность или обновить только один номер.

Во втором варианте:

  1. Таблица users хранит только данные пользователя.
  2. Таблица user_phones хранит по одной строке на каждый телефон.
  3. Связь user_id показывает, какому пользователю принадлежит номер.
  4. Составной первичный ключ (user_id, phone) не позволяет задублировать один и тот же телефон у одного пользователя.

Такой подход соответствует 1NF, потому что каждое поле содержит одно значение.

Ключевые моменты:

  • В 1NF каждое поле должно содержать одно атомарное значение.
  • Нельзя хранить списки, массивы и повторяющиеся группы в одном столбце.
  • Каждая строка должна быть уникально идентифицируема.
  • 1NF упрощает поиск, фильтрацию, обновление и связи между таблицами.
  • Нарушение 1NF обычно ведёт к сложным запросам и проблемам с целостностью данных.