Третья нормальная форма

Tret A Normal Naa Forma



Это третья часть серии «Пять нормальных форм». Заголовки первых двух частей (руководств) — «Первая нормальная форма», за которой следует «Вторая нормальная форма». В этой части серии объясняется третья нормальная форма.

Объяснение следует сюжетной линии: отец умер и оставил сыну немного денег. Сын решил вложить деньги в круглосуточный магазин. Круглосуточный магазин, также известный как круглосуточный магазин, представляет собой небольшой розничный бизнес, который получает предметы повседневного обихода от поставщиков и продает их отдельным покупателям по соседству.







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



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



Вы, читатель, завершили пять частей этой серии руководств; теперь вы разработчик базы данных. Владелец круглосуточного магазина - ваш друг. Вы посетили магазин два дня назад и обучили владельца и продавцов изготовлению стола в его первой нормальной форме. Вы также посетили магазин вчера и обучили их тому, как создать таблицу во второй нормальной форме из первой нормальной формы.





Сегодня вы только что пришли в магазин, чтобы научить их тому, как создать таблицу в третьей нормальной форме из второй нормальной формы. Все таблицы, которые у них есть в настоящее время, находятся во второй нормальной форме. Таблицы (по именам и заголовкам столбцов):

Товары (идентификатор продукта, идентификатор категории, продукт)
Категории (идентификатор категории, категория)



Продажи(saleID, клиент, сотрудник, дата)
SaleDetails(saleID, productID, numberSold, SellingPrice)

Заказы(orderID, поставщик, сотрудник, дата)
OrderDetails(orderID, productID, numberBought, costPrice)

Одиночные или составные клавиши подчеркнуты.

Обобщив то, чему учили за предыдущие два дня, и прежде чем вы успели что-либо сделать, хозяин спрашивает:

«А как насчет номеров телефонов, адресов и т. д. для клиентов и сотрудников?

Как насчет количества товаров на складе, уровня повторного заказа и т. д.?
Нужны ли им свои отдельные столы или их следует встроить в существующие столы?»

Вы, разработчик базы данных, отвечаете:

«Поздравляю, Хозяин! Вы косвенно представили проблему Третьей Нормальной Формы».

Ты продолжай.

Другие необходимые столбцы

Другие необходимые столбцы сначала добавляются в предыдущие таблицы, находящиеся в 1НФ и 2НФ. Некоторые из предыдущих имен столбцов изменены.

Как минимум, таблица категорий должна иметь следующие столбцы:

Категории (идентификатор категории, имя категории, описание)

Описание — это короткий абзац, описывающий категорию. Эта таблица категорий уже находится в 1NF, 2NF и 3NF. 3NF объясняется ниже:

Как минимум, таблица «Продукты» должна иметь следующие столбцы:

Продукты (идентификатор продукта, идентификатор категории, идентификатор поставщика, имя продукта, цена единицы, количество в наличии, уровень повторного заказа)

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

ИД категории и ИД поставщика являются внешними ключами. Вот почему они имеют подчеркивание тире вместо одинарного подчеркивания. Внешний ключ объясняется ниже. В предыдущей части серии (вторая нормальная форма) categoryID был частью первичного ключа с одним подчеркиванием из-за того, как он был получен. Однако из приведенного ниже пояснения становится ясно, что идентификатор категории должен быть внешним ключом (с подчеркиванием тире).

Эта таблица продуктов уже находится в 1NF, 2NF и 3NF. Посмотрите, почему это в 3NF ниже:

Как минимум, таблица SaleDetails должна иметь следующие столбцы:

SaleDetails(saleID, productID, unitSellingPrice, количество, скидка)

Ожидается, что в большинстве случаев значение скидки будет равно нулю. Скидка — это скидка, которую магазин предоставляет покупателю.

Как минимум, таблица OrderDetails должна иметь следующие столбцы:

OrderDetails(orderID, productID, unitCostPrice, количество, скидка)

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

Как показано ниже, таблица «Продукты» может рассматриваться как 2NF или 3NF. Таблицы Sales и Order имеют проблему 3NF. Для объяснения проблемы и решения будет использоваться только таблица продаж. 3NF для таблицы заказов и таблицы продуктов следуют аналогичным рассуждениям и будут просто цитироваться.

При добавлении столбцов таблица «Продажи» будет выглядеть так:

Продажи(saleID, dateSold customerName, телефон, адрес, город, регион, почтовый индекс, страна, сотрудник)

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

Эта таблица продаж все еще находится во 2NF, так как правила 1NF и 2NF не были нарушены. Однако следует понимать, что в строке таблицы «Продажи» клиент (имя) был заменен семью ячейками строки клиента.

Примечание: адресная ячейка содержит номер дома, название улицы или дороги и название города, разделенные запятыми. Город можно рассматривать как состоящий из нескольких городов. Хотя эти конкретные компоненты строки разделяются запятыми, они образуют одно значение ячейки, а не три значения ячейки.

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

Таблица продаж — 2NF — без идентификатора клиента

Столбец типа данных SaleID является целым числом или, лучше, автоинкрементом. Тип данных столбца dateSold — это дата, а не число, поскольку он содержит символ «/», который не является цифрой. Тип данных для остальных столбцов, включая столбец телефона, — строка (или текст). Номер телефона имеет символ «-», который не является цифрой.

Обратите внимание, что для каждой строки клиент (имя), как и в предыдущей части серии, был заменен семью ячейками, одна из которых по-прежнему является именем клиента. Это означает, что данные клиента являются сущностью. В настоящее время имя клиента идентифицирует остальные шесть данных подряд. Если эта таблица запрограммирована, будет удобно идентифицировать сущность клиента в каждой строке целым числом (не с автоинкрементом). В этом случае столбец customerID должен предшествовать столбцу customerName. Предыдущая таблица становится:

Таблица продаж — 2NF — с идентификатором клиента

Существует три идентификатора клиента: 1, 2 и 3, причем 1 встречается пять раз для Джона Смита, 2 — два раза для Джеймса Тейлора и 3 — один раз для Сьюзен Райт.

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

Правила для третьей нормальной формы

Таблица находится в третьей нормальной форме, если она удовлетворяет следующим правилам:

  1. Он уже должен быть во второй нормальной форме.
  2. И у него не должно быть транзитивной зависимости.

Тогда один из клерков (служащих) спрашивает: «Что такое транзитивная зависимость?». А вы, разработчик базы данных, отвечаете: «Хороший вопрос!»

Транзитивная зависимость

Это правда, что в строке SaleID идентифицирует все значения в строке; однако идентификатор клиента идентифицирует его семь значений данных, но не идентифицирует остальные значения, определенные идентификатором Продажи в этой строке. Иными словами, SaleID зависит от десяти значений ячеек в каждой строке. Однако идентификатор клиента зависит от семи значений ячеек в той же строке, но идентификатор клиента не зависит от идентификатора продажи и других значений, от которых зависит идентификатор продажи.

Такая зависимость для custumerID является транзитивной зависимостью. А идентификатор клиента называется внешним ключом и в этой серии руководств «Пять нормальных форм» подчеркнут тире.

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

Предыдущая таблица Sales с внешним ключом и его зависимыми элементами вызвала бы проблемы с учетом (аномалии).

Таблица продаж от 2NF до 3NF

Чтобы решить проблему, связанную с внешним ключом и его зависимостями, удалите внешний ключ и его зависимые элементы, чтобы сформировать новую таблицу без повторений. Однако, даже если внешний ключ не зависит от первичного ключа, первичный ключ зависит от внешнего ключа. Таким образом, копия внешнего ключа должна оставаться в родительской таблице. На данный момент новая таблица продаж соответствует стандартам 1NF, 2NF и 3NF; это родительская таблица. Новая дочерняя таблица из предыдущей таблицы Sales также совместима с 1NF, 2NF и 3NF. Имя дочерней таблицы с внешним ключом и его зависимыми элементами — Customers. Если подходящее имя найти не удается, значит, что-то пошло не так при анализе. Новая таблица продаж в 3NF:

Итоговая таблица продаж в 3NF

Эта таблица в 3NF имеет то же количество строк, что и во 2NF, но с меньшим количеством столбцов.

Обозначение таблицы для этой окончательной таблицы продаж в 3NF:

Продажи (идентификатор продажи, дата продажи, идентификатор клиента, идентификатор сотрудника)

saleID — это первичный ключ с одним подчеркиванием. customerID — это внешний ключ с подчеркиванием тире. employeeID также является внешним ключом с подчеркиванием тире. Обратите внимание, что ситуация с сотрудником в таблице «Продажи» во 2NF аналогична ситуации с клиентом. Идентификатор сотрудника и его собственные зависимые элементы должны быть извлечены для формирования другой таблицы; копия идентификатора сотрудника остается.

Примечание: идентификатор продажи, идентификатор клиента и идентификатор сотрудника не образуют составной ключ. идентификатор продажи зависит от идентификатора клиента и идентификатора сотрудника.

Отношения между saleID и customerID являются многими-к-одному.

Таблица клиентов в 3NF

Эта таблица имеет три строки вместо 9 строк в таблице продаж 2NF. В этой таблице идентификатор клиента является первичным ключом. Это то же самое, что и внешний ключ в таблице Sales, но без повторений. Внешний ключ в таблице Sales и первичный ключ в таблице Customer связывают обе таблицы.

Повторяющиеся строки в таблице Customer были удалены, чтобы не нарушать 1NF.

Как может видеть читатель, помещение таблицы в 3НФ также решило бы проблему повторяющихся строк (избыточность).

Обозначение таблицы для таблицы клиентов:

Клиенты(customerID, customerName, телефон, адрес, город, регион, почтовый индекс, страна)

Пересмотр таблицы продуктов

Таблица продуктов, приведенная выше в форме обозначений:

Продукты (идентификатор продукта, идентификатор категории, идентификатор поставщика, имя продукта, цена единицы, количество в наличии, уровень повторного заказа)

Первичный ключ здесь — productID. ИД категории и ИД поставщика являются внешними ключами. Как и в таблице «Клиенты», есть таблица «Категории», где идентификатор категории — первичный ключ, и таблица «Поставщик», где идентификатор поставщика — первичный ключ.

Если значения ячеек для unitPrice, amountInStock и reorderLevel останутся фиксированными, то таблица Products, как она есть, действительно находится в 3NF. Если эти значения будут меняться, то таблица Products, как она есть, находится во 2NF. В этой части серии руководств предполагается, что эти значения остаются неизменными с течением времени.

Все таблицы

Все таблицы теперь в 3NF. Они показаны как:

Сотрудники(employeeID, имя, телефон, адрес, город, регион, почтовый индекс, страна, дата рождения, дата найма, дата освобождения)

Поставщики(supplierID, имя, телефон, адрес, город, регион, почтовый индекс, страна)

Продукты (идентификатор продукта, идентификатор категории, идентификатор поставщика, имя продукта, цена единицы, количество в наличии, уровень повторного заказа)
Категории (идентификатор категории, имя категории, описание)

Продажи (идентификатор продажи, дата продажи, идентификатор клиента, идентификатор сотрудника)
SaleDetails(saleID, productID, numberSold, SellingPrice)
Клиенты(customerID, customerName, телефон, адрес, город, регион, почтовый индекс, страна)

Заказы (идентификатор заказа, дата продажи, идентификатор поставщика, идентификатор сотрудника)
OrderDetails(orderID, productID, numberBought, costPrice)

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

Тестирование посоха

К этому моменту все сотрудники, включая владельца, должны были понимать 1NF, 2NF и 3NF. Однако их нужно тестировать. Все они, включая хозяина, будут сидеть в разных местах и ​​выполнять тест. Тест, состоящий из одного вопроса, займет один час и выглядит следующим образом:

Вопрос: Используя правила для 1НФ, 2НФ и 3НФ, докажите, что все приведенные выше девять таблиц уже находятся в первой нормальной форме, второй нормальной форме и третьей нормальной форме. Клиенты и поставщики не обязательно должны быть реальными субъектами. Данные для таблиц должны поддерживать обозначения таблиц.

Пока они завершают тест, вы, как разработчик базы данных, выходите перекусить и выпить пива, чтобы вернуться через час.

Близкое и далекое будущее

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

Кроме того, пока вы их обучали, а теперь, когда они проходят тест, клиенты приходили и уходили без обслуживания. Это нехорошо для бизнеса, и вы, разработчик базы данных, это знаете. Некоторые клиенты могут пойти в магазины конкурентов и никогда не вернуться.

Вам, разработчику базы данных, 30 лет. Хозяину, как и вашему другу, тоже 30 лет. Клерки (служащие) в возрасте от 18 до 24 лет. Все качества, необходимые им для работы на собственника, были: быть здоровым, уметь читать и писать, уметь складывать, вычитать, умножать и делить , а также иметь возможность пользоваться компьютером и Интернетом.

Когда таблица находится в 3NF, большинство уязвимостей из базы данных устранено. Многие коммерческие базы данных не выходят за рамки 3NF, и фирмам или компаниям это удобно.

Итак, если все они пройдут тест, вы попросите клерков уйти и продолжить работу. Вы также посоветуете им откладывать часть своей зарплаты, чтобы они могли владеть своими магазинами. Вы продолжите завтра обучать только собственника в 4NF и 5NF. Со знанием 4NF и 5NF удаляются все известные уязвимости.

Оценка

Через час вы, разработчик базы данных, возвращаетесь. Вы отмечаете их сценарии. Прекрасная новость! Все они, включая собственника, имеют по 100%. Ура! Это отлично!

Так что поздравляю всех вас: учителя и учеников.

В этом уроке больше нечего делать, кроме как подвести итоги.

Вывод

Таблица находится в первой нормальной форме, если она не нарушает ни одно из следующих правил:

  1. Все столбцы в таблице должны иметь уникальные имена заголовков.
  2. Каждая ячейка должна иметь только одно значение.
  3. Значения, хранящиеся в столбце, должны быть одного типа.
  4. Ряды должны быть четкими.
  5. Порядок столбцов или строк не имеет значения.

Таблица находится во второй нормальной форме, если она не нарушает ни одно из следующих правил:

  1. Таблица уже должна быть в первой нормальной форме.
  2. Не должно быть частичной зависимости.

Таблица находится в третьей нормальной форме, если она не нарушает ни одно из следующих правил:

  1. Он должен быть уже во второй нормальной форме.
  2. И он не должен иметь транзитивной зависимости.

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

Вы назначаете встречу только с владельцем, которая состоится завтра в его офисе для обучения 4NF и 5NF.