Ответ
Нормальные формы (НФ) — это набор правил проектирования схемы БД, направленных на устранение избыточности данных и аномалий при операциях вставки, обновления и удаления (аномалии модификации).
Основные нормальные формы:
-
Первая нормальная форма (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НФ):
- Таблица находится в 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НФ):
- Таблица находится в 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НФ): Без компотов. Ты не хранишь всё в одной миске. Каждая вещь — отдельно. В таблице так же: никаких «списков через запятую» в одной ячейке. Это жесть, доверия к таким данным — ноль ебать.
-- Так делают только ебанько: все телефоны в одну кучу. 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НФ): Без прилипал. Таблица уже прибрана (1НФ), но есть нюанс. Смотри: допустим, у тебя заказ от поставщика. Ключ составной —
(номер_заказа, айди_поставщика). И вдруг в этой же таблице лежитназвание_поставщика. Так, стопэ. Название-то привязано только к айди поставщика, а на номер заказа ему похуй! Это частичная зависимость — как приклеенная жвачка под столом. Её надо отодрать и вынести в отдельную, нормальную таблицуsuppliers. Чтобы не пришлось обновлять название поставщика в тысяче записей, если он «Рога и копыта» вдруг станет «Рога и хвосты». -
Третья нормальная форма (3НФ): Боба не толстый. Всё ещё круче. Таблица в 2НФ, но в ней затесалась транзитивная зависимость. Классический пример: таблица
employeesс полямиemployee_id,cityи...city_population. Ты в это веришь? Население города зависит от города, а не от сотрудника! Это чистой воды транзит. Получается, чтобы изменить население Москвы, тебе надо лазить по всем московским сотрудникам и у каждого править цифру. Это же пиздопроебищно! Выноси город с населением в отдельную таблицуcitiesи ссылайся на неё. Все довольны, данные не дублируются, аномалий — как не бывало.
Зачем весь этот геморрой? А затем, чувак, чтобы твои данные не превратились в свалку, где при обновлении одного факта нужно вручную править овердохуища записей, а при удалении — случайно не выкосить половину нужной инфы. Целостность, ясность, порядок. Хотя да, иногда для сумасшедшей скорости чтения (в каких-нибудь аналитических штуках) этот порядок сознательно нарушают — денормализуют. Но это уже осознанный грех, как бутылка пива в среду. Сначала научись правильно делать, а потом уже хулигань.