Что такое нормальные формы и какие существуют
Что проверяют
Понимаете ли вы, от каких проблем спасает нормализация, и умеете ли увидеть нарушение на конкретной таблице. Для аналитика данных следом почти всегда спрашивают обратное: почему в хранилище схему сознательно денормализуют и что такое «звезда».
Как отвечать
Нормализация раскладывает данные по таблицам так, чтобы каждый факт хранился в одном месте. Без неё возникают аномалии: обновления (город клиента записан в сотне заказов, поменяли в 99), вставки (нельзя завести товар, пока его никто не купил) и удаления (удалили последний заказ и потеряли клиента).
- 1NF: значения атомарны, повторяющихся групп нет. Плохо:
phones = '111, 222'или столбцыphone1,phone2,phone3; - 2NF: 1NF плюс каждый неключевой атрибут зависит от всего составного ключа. В
order_items(order_id, product_id, qty, product_name)название зависит только отproduct_id, его выносят вproducts; - 3NF: 2NF плюс нет транзитивных зависимостей. В
orders(order_id, customer_id, customer_city)город зависит от клиента, а не от заказа; - НФБК (BCNF): левая часть любой нетривиальной функциональной зависимости является суперключом. От 3NF отличается только в таблицах с несколькими пересекающимися потенциальными ключами;
- 4NF и 5NF: многозначные зависимости и зависимости соединения, на практике встречаются редко.
Для транзакционных систем обычно хватает 3NF или НФБК. В хранилищах, особенно в колоночных СУБД вроде ClickHouse, соединения больших таблиц дороги, поэтому строят «звезду» по Кимбаллу: таблица фактов и денормализованные измерения. В dbt это видно по слоям: staging близок к нормализованному источнику, marts денормализованы под потребителя.
Где спотыкаются
Выучили определения, но не находят нарушение в таблице, которую дал интервьюер.
Путают 2NF и 3NF. Вторая форма про частичную зависимость от составного ключа, поэтому таблица с простым ключом, будучи в 1NF, уже во 2NF. Третья про зависимость через другой неключевой атрибут.
Считают денормализацию ошибкой проектирования. В аналитике это норма, но за неё платят дублированием, сложными обновлениями и необходимостью хранить историю измерений (SCD второго типа).