tgoop.com/big_data_systems_analysis/140
Create:
Last Update:
Last Update:
3НФ: спасаемся от хаоса в данных
В прошлый раз мы поговорили про 1 и 2НФ, пора двигаться дальше.
Третья нормальная форма (3НФ) — один из ключевых этапов нормализации данных, который помогает избежать избыточности и аномалий при обновлении информации.
Отношение находится в 3НФ, когда находится во 2НФ и каждый не ключевой атрибут нетранзитивно зависит от первичного ключа.
Как следует из определения, чтобы отношение находилось в 3НФ, оно должно удовлетворять двум условиям:
1. Находиться в 2НФ (то есть быть приведенным к состоянию, где все неключевые атрибуты зависят от всего первичного ключа).
2. Каждый неключевой атрибут должен зависеть только от первичного ключа и ни от чего другого.
Непонятно? Рассмотрим на примере.
Представьте, что у нас есть таблица с информацией о заказах:
| order_id | product_id | product_name | category | qty |
|----------|------------|--------------|----------|-----|
| 1 | 101 | Ноутбук | Техника | 2 |
| 2 | 102 | Смартфон | Техника | 1 |
| 3 | 103 | Футболка | Одежда | 3 |
Эта таблица нарушает 3НФ, потому что есть зависимость product_id -> product_name -> category. То есть название товара и его категория зависят от id продукта, а не напрямую от id заказа.
Чтобы привести таблицу к 3НФ, нужно разбить ее на несколько связанных таблиц:
В итоге структура будет выглядеть так:
Таблица orders:
| order_id | product_id | qty |
|----------|------------|-----|
| 1 | 101 | 2 |
| 2 | 102 | 1 |
| 3 | 103 | 3 |
Таблица products:
| product_id | product_name | category |
|------------|--------------|----------|
| 101 | Ноутбук | Техника |
| 102 | Смартфон | Техника |
| 103 | Футболка | Одежда |
Внимательный читатель заметит, что таблица products всё еще не находится в 3НФ
А мы пойдём дальше.
Определить нарушение 3НФ очень просто. Задайте себе несколько вопросов:
– Есть ли в таблице поля, значения которых повторяются (или могут повторяться) для разных строк?
– Можно ли определить значение одного поля через другое неключевое поле?
– При изменении одной записи, нужно ли обновлять другие записи с такими же данными?
Если хотя бы на один вопрос вы ответили "да", скорее всего, ваша таблица не соответствует 3НФ.
Применение 3НФ даёт несколько преимуществ:
– уменьшение избыточности данных: информация хранится только в одном месте, что упрощает обновление и поддержку.
– улучшение целостности данных: меньше шансов, что при обновлении информации возникнут несоответствия.
– гибкость при изменении структуры данных: если нужно добавить новые атрибуты, это не повлияет на таблицу заказов.
Однако стоит помнить, что чрезмерная нормализация может усложнить запросы и снизить производительность, особенно на больших наборах данных. Поэтому в реальных проектах часто используют денормализацию, например, при создании отдельных, часто используемых бизнесом витрин.
#dwh