Немного теории

Для удобной систематизации таблиц данных и корректного извлечения информации из них существует 6 нормальных форм. В Экстракторе 1С используется 3 из них. В данной статье мы объясним, что такое 1, 2 и 3 Нормальные формы, а также рассмотрим методы приведения таблиц в эти формы.

Ознакомьтесь с терминами и понятиями, которые мы будем использовать в данной статье для более комфортного восприятия:

Термины и понятия

Атрибут — свойство некоторой сущности. Часто называется полем таблицы.
Домен атрибута — множество допустимых значений, которые может принимать атрибут.

Скалярное значение — это одно значение (одна строка, один столбец) необходимого типа данных. Скалярные типы данных представляют собой простые значения, которые не могут быть разделены на более мелкие составляющие.
Функциональная зависимость между атрибутами (множествами атрибутов) X и Y означает, что для любого допустимого набора кортежей в данном отношении: если два кортежа совпадают по значению X, то они совпадают по значению Y. Например, если значение атрибута «Название компании» — Canonical Ltd, то значением атрибута «Штаб-квартира» в таком кортеже всегда будет Millbank Tower, London, United Kingdom. Обозначение: {X} → {Y}.

Неприводимость означает, что в составе потенциального ключа отсутствует меньшее подмножество атрибутов, от которого можно также вывести данную функциональную зависимость.

Первичный ключ — это специальное поле в таблице, которое однозначно идентифицирует каждую запись или строку в базе данных.

Нормальная форма — требование, предъявляемое к структуре таблиц в теории реляционных баз данных для устранения из базы избыточных функциональных зависимостей между атрибутами (полями таблиц).
Метод нормальных форм (НФ) состоит в сборе информации о объектах решения задачи в рамках одного отношения и последующей декомпозиции этого отношения на несколько взаимосвязанных отношений на основе процедур нормализации отношений.
Цель нормализации: исключить избыточное дублирование данных, которое является причиной аномалий, возникших при добавлении, редактировании и удалении кортежей(строк таблицы).

Первая нормальная форма (1NF)

Таблица находится в первой нормальной форме (далее — 1NF), если:

  • ее атрибуты являются простыми;

  • используемые домены атрибутов содержат только скалярные значения;

  • в таблице нет повторяющихся строк.

Рассмотрим на примере таблицы “Автомобили“:

Марка

Модель

Lada

Granta, Priora, Vesta

Chevrolet

Camaro

В данном случае, видим нарушение нормализации 1NF, потому что в одной ячейке находится список из трех элементов: Granta, Priora, Vesta, то есть он не является атомарным. При приведении таблицы к 1NF получится следующее:

Марка

Модель

Lada

Granta

Lada

Priora

Lada

Vesta

Chevrolet

Camaro

Вторая нормальная форма (2NF)

Таблица находится во второй нормальной форме (далее — 2NF), если:

  • она уже находится в 1NF;

  • каждый не ключевой атрибут неприводимо зависит от Первичного Ключа.

Рассмотрим на примере следующей таблицы:

Модель

Марка

Цена

Скидка

Granta

Lada

800000

10%

Priora

Lada

550000

10%

Vesta

Lada

1500000

10%

Camaro

Chevrolet

3400000

5%

Таблица находится в 1NF, но не во 2NF. Почему?

Итак, цена автомобиля зависит от модели и марки, в свою очередь, скидка зависит от марки, то есть зависимость от первичного ключа неполная. Исправляется это путем декомпозиции на две таблицы, в которых не ключевые атрибуты зависят от первичного ключа.

То есть, выглядеть это будет так:

Модель

Марка

Цена

Granta

Lada

800000

Priora

Lada

550000

Vesta

Lada

1500000

Camaro

Chevrolet

3400000

Марка

Скидка

Lada

10%

Chevrolet

5%

Третья нормальная форма (3NF)

Таблица находится в третьей нормальной форме (далее — 3NF), если:

  • она уже находится в находится во 2NF;

  • каждый не ключевой атрибут нетранзитивно зависит от первичного ключа.

Простыми словами, необходимо вынести все не ключевые поля, содержимое которых может относиться к нескольким записям таблицы — в отдельные таблицы.

Рассмотрим на примере следующей таблицы:

Марка

Магазин

Телефон

Lada

Сокол Моторс

309-20-79

Chery

Сокол Моторс

309-20-79

Chevrolet

Эксперт Моторс

273-16-92

Таблица находится во 2NF, но не в 3NF. Почему?
Потому что в ней атрибут «Марка» является первичным ключом. У автомобилей нет личных номеров телефонов (что вполне понятно, однако, в работе с таблицами данных важно брать во внимание даже такие детали), т.е., телефон зависит исключительно от магазина.
Таким образом, в таблице существуют следующие функциональные зависимости:

  • Марка => Магазин;

  • Магазин => Телефон;

  • Марка => Телефон.

Зависимость “Марка => Телефон” является транзитивной, следовательно, эта таблица находится не в 3NF.
Приведем данные этой таблицы к 3NF. У нас снова получится две таблицы:

Магазин

Телефон

Сокол Моторс

309-20-79

Эксперт Моторс

273-16-92

Марка

Магазин

Lada

Сокол Моторс

Chery

Сокол Моторс

Chevrolet

Эксперт Моторс

Практическое применение нормализации в Экстракторе 1С

В денормализованной таблице данные выглядят следующим образом:

В данном случае, каждая "Продажа" привязана к своей "Номенклатуре", и если мы поменяем в "Продаже 1" "Номенклатуру 1" на "Номенклатуру 2", то в таблице в базе данных обновится вся связка "Продажи-Номенклатура".

Однако, если поменять саму "Номенклатуру 1" в справочнике, а не в продаже, и она у нас, допустим, станет "Номенклатура 4", то в 1С она будет называться иначе и в карточке продаж тоже будет называться иначе, но в базу данных эта информация уже не попадет (т.к. "Продажа 1" осталась неизменной). Соответственно, данные в 1С и таблице данных уже противоречат друг другу. И это существенный минус денормализованной таблицы.

Но если разбить денормализованную таблицу "Продажи-Номенклатура" на две нормализованных: "Продажи" и "Номенклатура", выгрузить их в базу данных, после чего, собрать из них представление. То в таком случае, при изменении, например, номенклатуры в 1С, эта конкретная номенклатура выгружается в базу данных, где обновляется и в представлении, в итоге, она тоже меняется на правильную.

В варианте с денормализованной таблицей продажи работали правильно, а справочники — нет, после нормализации корректно работают и продажи и справочники.

Теперь, чтобы соединить таблицы продаж и номенклатуры между собой необходимы какие-то правила, некий уникальный ключ соединения. Такие ключи можно получить на этапе настройки вычисляемых полей в Экстракторе 1С.