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

Ответ

Существует 6 нормальных форм (НФ), но ключевыми для практического применения являются первые три.

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

  1. Первая нормальная форма (1НФ): Атомарность данных. Все значения атрибутов неделимы, нет повторяющихся групп.

    -- НЕ 1НФ (список в ячейке)
    CREATE TABLE Orders (order_id INT, products VARCHAR(255)); -- 'ProductA, ProductB'
    
    -- 1НФ
    CREATE TABLE OrderItems (order_id INT, product_id INT);
  2. Вторая нормальная форма (2НФ): Выполнена 1НФ, и каждый неключевой атрибут полностью зависит от всего первичного ключа (нет частичных зависимостей).
  3. Третья нормальная форма (3НФ): Выполнена 2НФ, и неключевые атрибуты не зависят друг от друга (нет транзитивных зависимостей).

Дополнительные нормальные формы:

  • Нормальная форма Бойса-Кодда (НФБК): Усиленная 3НФ, где любая нетривиальная функциональная зависимость имеет в качестве детерминанта потенциальный ключ.
  • Четвертая нормальная форма (4НФ): Отсутствие многозначных зависимостей.
  • Пятая нормальная форма (5НФ): Отсутствие зависимостей соединения.

На практике для большинства приложений достаточно приведения к 3НФ.

Ответ 18+ 🔞

А, нормальные формы, блядь! Ну, это как с квартирой: можно жить в хрущёвке, где всё в одной куче, а можно сделать евроремонт с перегородками. Только тут не стены, а таблицы в базе.

Слушай, их, этих форм, дохуя — целых шесть. Но если ты не академик какой-нибудь, то первые три — твои лучшие друзья, а остальные — так, для понтов и особых извращенцев.

Вот что реально нужно знать:

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

    -- Так делать — пиздец как плохо (в ячейке целый список товаров)
    CREATE TABLE Orders (order_id INT, products VARCHAR(255)); -- 'Молоко, Хлеб, Водка'
    
    -- А вот так — уже красота, 1НФ
    CREATE TABLE OrderItems (order_id INT, product_id INT);
  2. Вторая нормальная форма (2НФ). Тут уже начинается магия. Ты должен убедиться, что вся информация в строке зависит от ВСЕГО первичного ключа, а не от его кусочка. Чтобы не было так, что половина данных привязана к одному полю ключа, а половина — к другому. Это как если бы отчество человека зависело только от его имени — бред же, блядь.

  3. Третья нормальная форма (3НФ). Апофеоз для обычного смертного. Ты добился 1НФ и 2НФ, и теперь нужно глянуть, не зависят ли поля в таблице друг от друга. Например, если у тебя есть город_id и название_страны, то страна-то зависит от города, а не от заказа! Значит, гони эту страну нахуй в отдельную таблицу про города. Убираем эти транзитивные зависимости, и мозг сразу легче дышит.

А дальше идёт уже высший пилотаж, на который обычно всем похуй:

  • НФБК (Бойса-Кодда). Это как 3НФ, но на стероидах. Для ситуаций, когда ключей может быть несколько, и нужно, чтобы всё от них зависело.
  • Четвёртая (4НФ) и Пятая (5НФ). Вот тут уже конкретные извращения про многозначные зависимости и зависимости соединения. Если ты до этого докатился в реальном проекте, то либо ты гений, либо у тебя проект — ебаный ад, и тебе нужно срочно менять работу.

Короче, запомни: в 95% случаев твоя цель — добиться 3НФ. База будет структурированной, данные не будут повторяться как сумасшедшие, и жить станет проще. Всё остальное — для особых случаев, когда и правда волнение ебать и терпения ноль.