"Проектирование реляционных баз данных." - читать интересную книгу автора (Джен Л. Харрингтон)

¦ В случаях, когда заказ является единственным заказом, в котором фигурирует пункт, теряются все данные о пункте.
¦ В случаях, когда удаляемый пункт является единственным пунктом, заказанным клиентом, теряются все данные о клиенте.
Аномалии удаления происходят, если часть первичного ключа строки при удалении данных о товарном пункте становится null-значением, что вынуждает удалять всю строку. Аномалия удаления приводит к потере тех данных, которые нужно было бы сохранить. Практически, при удалении данных о некоторой сущности приходится удалять в той же таблице еще и сведения о сущности, не связанной с первой.
Мораль: наличие в таблице более одной сущности — это очень плохо.
В отношении заказов возможен еще один вид аномалий, который не связан с первичным ключом. Это аномалии модификации, или обновления. В отношении заказов содержится большой объем ненужных дублируемых данных, в частности информация 0 Клиентах. Когда клиент меняет место жительства, сведения о нем должны быть изменены в каждой строке, для каждого пункта в каждом заказе, когда-либо сделанном Этим клиентом. Если все строки не будут изменены надлежащим образом, то данные, к°торые должны быть одинаковы, таковыми не будут. Возможной ситуацией при Работе с несогласованными данными является аномалия модификации.
Вторая нормальная форма
Для
устранения аномалий отношения первой нормальной формы можно разбить
. так, чтобы каждой сущности отношения 1NF соответствовало одно отношение. ^Пример, отношение заказов разбивается на четыре отношения (клиенты, товарные Ункты, заказы и пункты ассортимента). Подобные отношения соответствуют как ^Чнимум второй нормальной форме (2NF).
Зак. 523
56
Часть первая • Теория
С точки зрения теории вторая нормальная форма определяется следующим образом:
Отношение соответствует первой нормальной форме, и все неключевые атрибуты функционально зависят от полного первичного ключа.
Новым термином здесь является выражение "функционально зависят", т. е. между атрибутами существует взаимоотношение особого рода.
Понятие функциональной зависимости
Функциональная зависимость (functional dependency) — это одностороннее взаимоотношение между двумя атрибутами, когда в любой конкретный момент времени с каждым уникальным значением атрибута А связано через отношение только одно значение атрибута В. Предположим, что А — это номер клиента из отношения заказов. Каждый номер клиента связан с одним именем клиента, одной фамилией, одной улицей, одним городом, одним штатом, одним почтовым индексом и одним телефонным номером. Хотя значения этих атрибутов могут меняться, в любой момент существует только одно значение.
Таким образом, можно сказать, что имя, фамилия, улица, город, штат, индекс и номер телефона функционально зависят от номера клиента. Такое взаимоотношение часто записывается как
customer number -> first name, last name, street, city, state, zip, phone
и читается как "номером клиента определяются имя, фамилия, улица, город, штат, индекс и номер телефона". В этом взаимоотношении номер клиента называется определителем или детерминантом (determinant),— атрибутом, который определяет значения других атрибутов.
В обратном направлении функциональная зависимость не всегда сохраняется. Так, любое конкретное имя может быть связано с несколькими номерами клиентов (было бы удивительно, если бы в клиентской таблице любого размера имена клиентов не повторялись).
В таблице заказов существуют следующие функциональные зависимости:
customer number -> first name, last name, street, city, state, zip, phone
item number -> title, price
order number -> customer number, order date
item number + order number -> has shipped
Обратите внимание: для каждой сущности в отношении имеется один определитель, причем определителем является то, что было выбрано в качестве идентификатор сущности. Кроме того, если идентификатор сущности составной, составным являете и определитель. Отправлен ли (has shipped) товар, в рассматриваемом примере зависит от комбинации товара и заказа.
Глава 4 • Нормализация
57
Использование функциональных зависимостей для создания отношений 2NF
Если функциональные зависимости между атрибутами в среде базы данных определены правильно, их можно использовать для создания отношений второй нормальной формы. Каждый определитель становится первичным ключом отношения. Все атрибуты, функционально зависящие от него, становятся в отношении неключевыми атрибутами.
Исходное отношение заказов нужно разбить на четыре отношения:
customers (customer number, first name, last name, street, city,
state, zip, phone) items (item number, title, price) orders (order number, customer number, order date) line items (order number, item number, has shipped)
Каждое из этих отношений должно, в свою очередь, соответствовать одной сущности на ER-диаграмме.
Когда решают, чем на самом деле определяется структура базы данных — функциональными зависимостями или сущностями, это напоминает вечный вопрос о том, что было раньше: курица или яйцо. Самое важное — ER-диаграмма и функциональные зависимости, выявляемые в отношениях, соответствуют друг другу. Нет никакой разницы в том, как именно проектируется система: анализом функциональных зависимостей или анализом сущностей.
Отношениями, созданными из исходного отношения заказов, устраняются аномалии оригинала:
¦ Теперь можно вводить данные о клиенте до того, как тот сделает заказ.
¦ Можно вводить данные о заказе до того, как будет известно о каком-либо пункте этого заказа.
¦ Можно сохранять данные о товарах до того, как они будут заказаны.
¦ Пункты ассортимента можно удалять из заказа, не воздействуя на данные, описывающие конкретный пункт, сам заказ или товар.
¦ Данные, описывающие клиента, сохраняются только один раз, и поэтому любое их изменение нужно фиксировать лишь однажды. Аномалия модификации при этом невозможна.
58 Часть первая • Теорий
Недостатки отношений 2NF
Хотя при использовании второй нормальной формы устраняются многие нед0. статки, порой приходится работать с отношениями, которые соответствуют второй нормальной форме, но тем не менее проявляют признаки различных аномалий. Пред. положим, что все продаваемые в Lasers Only лазерные диски одного наименования поступают от одного оптовика и что у каждого оптовика имеется только один товарный склад (warehouse), на котором установлен только один телефонный номер. Таким образом, следующее отношение соответствует второй нормальной форме:
items (item number, title, distributor, warehouse phone number)
Каждому номеру товара соответствует только по одному значению наименования товара, оптового поставщика и телефонного номера склада. Однако при этом существуют одна аномалия ввода: нельзя ввести данные об оптовике до тех пор, пока от него не поступит товар, и одна аномалия удаления: при удалении единственного товара оптовика теряются данные об этом оптовике. Кроме того, имеет место и аномалия модификации: телефонный номер склада оптовика дублируется для каждого товара, получаемого компанией от этого оптовика. Рассматриваемое отношение соответствует второй нормальной форме, но не третьей.
Третья нормальная форма
Третья нормальная форма предназначена для использования в ситуациях, подобных описанной выше, С точки зрения сущностей, в отношении items содержатся две сущности: товар и оптовый поставщик. Одно только это должно стать причиной разбиения данного отношения на два более мелких, соответствующих третьей нормальной форме:
items (item number, distributor)