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

Ответ

Нормальные формы (НФ) — это набор правил проектирования схемы БД, направленных на устранение избыточности данных и аномалий при операциях вставки, обновления и удаления (аномалии модификации).

Основные нормальные формы:

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

    • Все значения атрибутов атомарны (неделимы).
    • В таблице нет повторяющихся групп строк или столбцов.
      
      -- НЕ 1НФ: столбец 'phones' содержит составное значение
      CREATE TABLE contacts (id INT, name VARCHAR(100), phones VARCHAR(255)); -- '123, 456'

    -- 1НФ: каждый телефон в отдельной строке CREATE TABLE contacts (id INT, name VARCHAR(100), phone VARCHAR(20));

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

    • Таблица находится в 1НФ.
    • Каждый неключевой атрибут полностью зависит от всего составного первичного ключа (нет частичных зависимостей).
      -- НЕ 2НФ: 'supplier_name' зависит только от 'supplier_id', а не от всего ключа (order_id, supplier_id)
      CREATE TABLE order_supplies (order_id INT, supplier_id INT, supplier_name VARCHAR(100), item VARCHAR(100));
      -- Решение: вынести supplier_name в отдельную таблицу suppliers.
  3. Третья нормальная форма (3НФ):

    • Таблица находится в 2НФ.
    • Нет транзитивных зависимостей: неключевые атрибуты не зависят от других неключевых атрибутов.
      -- НЕ 3НФ: 'city_population' зависит от 'city', а не напрямую от 'employee_id'
      CREATE TABLE employees (employee_id INT, name VARCHAR(100), city VARCHAR(100), city_population INT);
      -- Решение: вынести city и city_population в отдельную таблицу cities.

Цель нормализации: повысить целостность данных, упростить поддержку и избежать противоречий. Денормализация иногда применяется осознанно для повышения производительности чтения в OLAP-системах.

Ответ 18+ 🔞

Давай разжую тебе эту тему про нормальные формы, а то я вижу, у тебя уже глаза стекленеют. Представь, что твоя база данных — это твоя квартира после хорошей вечеринки. Всё в одной куче: носки в холодильнике, пицца на книжной полке, а пульт от телевизора, ёпта, в унитазе. Жить можно, но каждый раз, когда нужно найти зажигалку, ты устраиваешь пиздец и переворачиваешь всё к хуям. Нормализация — это когда ты наводишь порядок: носки в комод, еда на кухню, а пульт, наконец, лежит где надо. Чтобы не было аномалий, сука.

Основные правила наведения порядка:

  1. Первая нормальная форма (1НФ): Без компотов. Ты не хранишь всё в одной миске. Каждая вещь — отдельно. В таблице так же: никаких «списков через запятую» в одной ячейке. Это жесть, доверия к таким данным — ноль ебать.

    -- Так делают только ебанько: все телефоны в одну кучу.
    CREATE TABLE contacts (id INT, name VARCHAR(100), phones VARCHAR(255)); -- '123, 456, 789'
    
    -- А так — уже человек: один факт — одна строка. Красота.
    CREATE TABLE contacts (id INT, name VARCHAR(100), phone VARCHAR(20));

    Если видишь запятую в поле — это не база, это помойка. Выкидывай нахуй.

  2. Вторая нормальная форма (2НФ): Без прилипал. Таблица уже прибрана (1НФ), но есть нюанс. Смотри: допустим, у тебя заказ от поставщика. Ключ составной — (номер_заказа, айди_поставщика). И вдруг в этой же таблице лежит название_поставщика. Так, стопэ. Название-то привязано только к айди поставщика, а на номер заказа ему похуй! Это частичная зависимость — как приклеенная жвачка под столом. Её надо отодрать и вынести в отдельную, нормальную таблицу suppliers. Чтобы не пришлось обновлять название поставщика в тысяче записей, если он «Рога и копыта» вдруг станет «Рога и хвосты».

  3. Третья нормальная форма (3НФ): Боба не толстый. Всё ещё круче. Таблица в 2НФ, но в ней затесалась транзитивная зависимость. Классический пример: таблица employees с полями employee_id, city и... city_population. Ты в это веришь? Население города зависит от города, а не от сотрудника! Это чистой воды транзит. Получается, чтобы изменить население Москвы, тебе надо лазить по всем московским сотрудникам и у каждого править цифру. Это же пиздопроебищно! Выноси город с населением в отдельную таблицу cities и ссылайся на неё. Все довольны, данные не дублируются, аномалий — как не бывало.

Зачем весь этот геморрой? А затем, чувак, чтобы твои данные не превратились в свалку, где при обновлении одного факта нужно вручную править овердохуища записей, а при удалении — случайно не выкосить половину нужной инфы. Целостность, ясность, порядок. Хотя да, иногда для сумасшедшей скорости чтения (в каких-нибудь аналитических штуках) этот порядок сознательно нарушают — денормализуют. Но это уже осознанный грех, как бутылка пива в среду. Сначала научись правильно делать, а потом уже хулигань.