# Нормализация

**Реляционная база данных** (SQL DB) - представляет собой набор связанных между собой, двумерных таблиц. Это определение указывает нам на то, что нам необходимо связывать таблицы своей базы данных между собой. Возникает следующий вопрос: "А как же связывать таблицы, по каким признакам?". Ответ на данных вопрос довольно таки прост, нам необходимо привести основную (не связанную таблицу) к **третьей нормальной форме**.

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

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

## Нормальные формы <a href="#normal-forms" id="normal-forms"></a>

### Первая нормальная форма <a href="#first-normal-form" id="first-normal-form"></a>

Отношение находится в первой нормальной форме, тогда и только тогда, когда ни один из кортежей, в своем атрибуте, не содержит перечислений.

В случае если, один из кортежей содержит перечисление в одном из своих атрибутов, то необходимо: создать точно такой же кортеж (за исключением первичного ключа), где в *перечисляемый* атрибут, записать второе значение. Первый кортеж в *перечисленном* атрибуте, теперь содержит только одно значение, так как второе, перенесено во второй кортеж.

### Вторая нормальная форма <a href="#second-normal-form" id="second-normal-form"></a>

Отношение находится во второй нормальной форме, тогда и только тогда, когда отношение находится в первой нормальной форме, и отношение не содержит функциональных зависимостей.

Ярким примером функциональной зависимости, будет указание имя автора и название издательства для, БД "Библиотека" таблица "Книга", в явном виде. Таким образом, если автор книги выйдет замуж или издательство изменит свое название, возможно, необходимо будет изменить большое количество кортежей.

### Третья нормальная форма <a href="#third-normal-form" id="third-normal-form"></a>

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

Отсутствующая транзитивная зависимость, проявляется когда - не ключевые атрибуты, не зависят от ключевого значения данного кортежа.

## Пример нормализации отношения <a href="#example-of-normalization-of-the-relationship" id="example-of-normalization-of-the-relationship"></a>

Есть не нормализованное отношение, которое необходимо привести к третьей нормальной форме. Отношение не содержит кортежей.

| №  | Атрибут        | Описание                         |
| -- | -------------- | -------------------------------- |
| 1  | Seller         | Фирма — продавец товара          |
| 2  | InnSeller      | ИНН продавца                     |
| 3  | Country        | Страна продавца                  |
| 4  | Chief          | Руководитель фирмы               |
| 5  | Address        | Юридический адрес фирмы          |
| 6  | Phone          | Телефон руководителя             |
| 7  | Manager        | Главный менеджер фирмы           |
| 8  | PhonePlus      | Телефон отдела продаж            |
| 9  | Bank           | Банк продавца                    |
| 10 | Account        | Номер счета в банке              |
| 11 | GoodsID        | Штрих-код товара                 |
| 12 | Goods          | Название товара                  |
| 13 | Picture        | Фото товара                      |
| 14 | Category       | Категория товара (кофе, печенье) |
| 15 | DateStart      | Дата изготовления товара         |
| 16 | Period         | Срок хранения товара, дней       |
| 17 | Manufacturer   | Изготовитель товара              |
| 18 | Unit           | Единица измерения                |
| 19 | CostUnit       | Цена за единицу                  |
| 20 | Count          | Количество товара                |
| 21 | Client         | Покупатель товара                |
| 22 | InnClient      | ИНН покупателя                   |
| 23 | Director       | Руководитель фирмы-покупателя    |
| 24 | PhoneDir       | Телефон директора                |
| 25 | Address Client | Юридический адрес фирмы          |
| 26 | BankClient     | Банк покупателя                  |
| 27 | Account Client | Номер счета в банке              |
| 28 | Volume         | Количество купленного товара     |
| 29 | CostUnitVol    | Цена за единицу                  |
| 30 | DateVolume     | Дата покупки товара              |
| 31 | Comment        | Примечания                       |

### Результат <a href="#result" id="result"></a>

{% file src="/files/-LkTDRGChRWb\_rvgclzE" %}
Диаграмма нормализованной таблицы
{% endfile %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://liannoi.gitbook.io/sql-server/directory/normalization.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
