Нормализация данных
Для удобной систематизации таблиц данных и корректного извлечения информации из них существует понятие нормализации. В Экстракторе используются три нормальные формы: 1NF, 2NF и 3NF. В данной статье объясняется, что это такое, и рассматриваются методы приведения таблиц к каждой из них.
Термины и понятия
Атрибут – свойство некоторой сущности, часто называется полем таблицы.
Домен атрибута – множество допустимых значений атрибута.
Скалярное значение – одно значение (одна строка, один столбец) необходимого типа данных; не может быть разделено на более мелкие составляющие.
Функциональная зависимость между атрибутами X и Y: если два кортежа совпадают по X, они совпадают и по Y. Обозначение: {X} → {Y}. Например, если значение атрибута «Название компании» — Canonical Ltd, то значением атрибута «Штаб-квартира» в таком кортеже всегда будет Millbank Tower, London, United Kingdom.
Неприводимость – отсутствие меньшего подмножества атрибутов потенциального ключа, от которого можно вывести данную функциональную зависимость.
Первичный ключ – поле, однозначно идентифицирующее каждую запись в таблице.
Нормальная форма – требование к структуре таблиц для устранения избыточных функциональных зависимостей между атрибутами.
Цель нормализации – исключить избыточное дублирование данных, которое приводит к аномалиям при добавлении, изменении и удалении строк.
Первая нормальная форма (1NF)
Таблица находится в 1NF, если:
атрибуты являются простыми;
домены атрибутов содержат только скалярные значения;
в таблице нет повторяющихся строк.
Пример таблицы «Автомобили», нарушающей 1NF: в ячейке «Модель» для Lada хранится список из трёх значений – нарушение атомарности.
Марка | Модель |
|---|---|
Lada | Granta, Priora, Vesta |
Chevrolet | Camaro |
После приведения к 1NF каждая модель занимает отдельную строку:
Марка | Модель |
|---|---|
Lada | Granta |
Lada | Priora |
Lada | Vesta |
Chevrolet | Camaro |
Вторая нормальная форма (2NF)
Таблица находится в 2NF, если:
она уже находится в 1NF;
каждый неключевой атрибут неприводимо зависит от первичного ключа.
Пример таблицы, нарушающей 2NF: «Скидка» зависит только от «Марки», а не от полного первичного ключа (Модель + Марка).
Модель | Марка | Цена | Скидка |
|---|---|---|---|
Granta | Lada | 800 000 | 10% |
Priora | Lada | 550 000 | 10% |
Vesta | Lada | 1 500 000 | 10% |
Camaro | Chevrolet | 3 400 000 | 5% |
Исправляется декомпозицией на две таблицы: «Модели с ценами» и «Марки со скидками».
Модель | Марка | Цена |
|---|---|---|
Granta | Lada | 800 000 |
Priora | Lada | 550 000 |
Vesta | Lada | 1 500 000 |
Camaro | Chevrolet | 3 400 000 |
Марка | Скидка |
|---|---|
Lada | 10% |
Chevrolet | 5% |
Третья нормальная форма (3NF)
Таблица находится в 3NF, если:
она уже находится в 2NF;
каждый неключевой атрибут нетранзитивно зависит от первичного ключа.
Необходимо вынести все неключевые поля, содержимое которых может относиться к нескольким записям, в отдельные таблицы. Пример таблицы, нарушающей 3NF: «Телефон» зависит от «Магазина», а не от «Марки» – транзитивная зависимость: Марка → Магазин → Телефон.
Марка | Магазин | Телефон |
|---|---|---|
Lada | Сокол Моторс | 309-20-79 |
Chery | Сокол Моторс | 309-20-79 |
Chevrolet | Эксперт Моторс | 273-16-92 |
Приведение к 3NF — декомпозиция на две таблицы:
Магазин | Телефон |
|---|---|
Сокол Моторс | 309-20-79 |
Эксперт Моторс | 273-16-92 |
Марка | Магазин |
|---|---|
Lada | Сокол Моторс |
Chery | Сокол Моторс |
Chevrolet | Эксперт Моторс |
Практическое применение нормализации
В денормализованной таблице данные о продажах и номенклатуре хранятся вместе. Если изменить наименование номенклатуры в справочнике 1С, а не в записи продажи, данные в таблице базы данных и в 1С начнут противоречить друг другу – это существенный минус денормализованной структуры.
При разбиении на две нормализованные таблицы — «Продажи» и «Номенклатура» — изменение наименования в 1С автоматически отражается в базе данных и в итоговых представлениях:
Для соединения нормализованных таблиц между собой необходим уникальный ключ. Такие ключи можно получить на этапе настройки вычисляемых полей в Экстракторе.