Правило 4: независимость полей

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

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

Давайте снова обратимся к таблице Заказы, представленной на рис. 8.9. При применении второго и третьего правил мы оставили сведения о магазине в таблице Заказы, поскольку казалось, что они нужны для полного описания заказа. Обратите внимание, что изменение названия магазина не влияет на другие поля записи. Но если несколько заказов содержат неправильное название магазина, то придется изменять много записей. Кроме того, если в заказе неверно указан магазин, то нельзя заменить название магазина без изменения его адреса и телефона в той же записи.

Заказчики

Код заказчика Имя заказчика Адрес заказчика Город заказчика Район или область заказчика Почтовый индекс заказчика Страна заказчика Телефон заказчика

 

Заказы

Код заказа Дата заказа Имя получателя Адрес получателя Город получателя Район или область получателя Почтовый индекс получателя Страна получателя

 

Код заказчика Общая стоимость Название магазина Адрес магазина Город магазина Район или область магазина Почтовый индекс магазина Телефон магазина

 

Содержание заказа

Код заказа ISBN Количество книг Цена Скидка Розничная цена

 

Книги

ISBN Название книги Предпола гаемая цена Год издания Порядковый номер издания Количество страниц Аннота ция Диск

 

Книги и авторы

ISBN Код автора Порядковый номер автора

 

Авторы

ISBN Фамилия автора Имя автора Отчество автора Сведения об авторе Адрес электронной почты автора

 

Без заливки показаны ПЕРВИЧНЫЕ КЛЮЧИ

 

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

 

Поля Название магазина, Адрес магазина и Телефон магазина не являются независимыми друг от друга. На самом деле поля Адрес магазина, Город магазина, Район или область магазина и Телефон магазина функционально зависят от поля Название магазина (см. правило 3). Хотя это и не очевидно, но Название магазина описывает не заказ, а совсем другой объект. Таким образом, скрупулезное применение четвертого правила просто помогает определить изменения, которые следовало бы внести в проект еще при использовании предыдущих правил. В нашем же случае это приводит к выделению отдельной таблицы Магазины, как показано на рис.8.10.

Теперь при неправильном написании названия магазина достаточно исправить его один раз в таблице Магазины. Необходимо отметить, что в качестве первичного ключа таблицы Магазины вместо поля Название магазина (длина которого может составлять 40-50 символов) используется более короткое поле Код магазина (примерно 5 цифр), что позволяет сократить размер связующих данных в таблице Заказы.

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

Другим (не столь строгим) способом проверки независимости полей является просмотр записей на наличие повторяющихся данных. В предыдущем варианте проекта название, адрес, район или область, почтовый код и телефон конкретного магазина могло появиться во многих записях заказов. Теперь же, когда у нас есть отдельная таблица Магазины, для исправления адреса магазина достаточно изменить только одно поле в одной записи таблицы Магазины. Если в заказе неправильно указан магазин, нужно только изменить поле Код магазина в таблице Заказы, и проблема будет решена.

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

 

Заказчики

Код заказчика Имя заказчика Адрес заказчика Город заказчика Район или область заказчика Почтовый индекс заказчика Страна заказчика Телефон заказчика

 

Заказы

Код заказа Код заказчика Дата заказа Имя получателя Адрес получателя Город получателя Район или область получателя

 

Почтовый индекс получателя Страна получателя Код магазина

 

Содержание заказа

Код заказа ISBN Количество книг Скидка

 

Магазины

Общая стоимость Название магазина Адрес магазина Город магазина Район или область магазина Почтовый индекс магазина Телефон магазина

 

Книги

ISBN Название книги Предпола гаемая цена Год издания Порядковый номер издания Количество страниц Аннота ция Диск

 

Книги и авторы

ISBN Код автора Порядковый номер автора

 

Авторы

ISBN Фамилия автора Имя автора Отчество автора Сведения об авторе Адрес электронной почты автора

 

Без заливки показаны ПЕРВИЧНЫЕ КЛЮЧИ

 

Рис. 8.10 Проект базы данных Книги после применения всех правил нормализации