1. Избыточность. Данные практически всех столбцов многократно повторяются. Повторяются и некоторые наборы данных (Блюдо-Вид-Рецепт, Продукт-Калорийность, Поставщик-Город-Страна). Нежелательно повторение рецептов, некоторые из которых намного больше рецепта "Лобио". И уж совсем плохо, что все данные о блюде (включая рецепт) повторяются каждый раз, когда это блюдо включается в меню.
2. ^ Потенциальная противоречивость (аномалии обновления). Вследствие избыточности можно обновить адрес поставщика в одной строке, оставляя его неизменным в других. Если поставщик кофе сообщил о своем переезде в Харбин и была обновлена строка с продуктом кофе, то у поставщика "Хуанхэ" появляются два адреса, один из которых не актуален. Следовательно, при обновлениях необходимо просматривать всю таблицу для нахождения и изменения всех подходящих строк.
3. ^ Аномалии включения. В БД не может быть записан новый поставщик ("Няринга", Вильнюс, Литва), если поставляемый им продукт (Огурцы) не используется ни в одном блюде. Можно, конечно, поместить неопределенные значения в столбцы Блюдо, Вид, Порций и Вес (г) для этого поставщика. Но если появится блюдо, в котором используется этот продукт, не забудем ли мы удалить строку с неопределенными значениями?
По аналогичным причинам нельзя ввести и новый продукт (например, Баклажаны), который предлагает существующий поставщик (например, "Полесье"). А как ввести новое блюдо, если в нем используется новый продукт (Крабы)?
4. ^ Аномалии удаления. Обратная проблема возникает при необходимости удаления всех продуктов, поставляемых данным поставщиком или всех блюд, использующих эти продукты. При таких удалениях будут утрачены сведения о таком поставщике.
Многие проблемы этого примера исчезнут, если выделить в отдельные таблицы сведения о блюдах, продуктах, рецептах, расходе блюд, поставщиках продуктов и их городах, а также создать связующие таблицы "Состав" и "Поставки" (Рис. 3.2.2.1).
Блюда Продукты
Код блюда
| Блюдо
| Вид
| 1
| Лобио
| Закуска
| 2
| Харчо
| Суп
| 3
| Шашлык
| Горячее
| …
| …
| …
| | ^ Код продукта
| Продукт
| Калорийность
| 1
| Фасоль
| 3070
| 2
| Лук
| 450
| 3
| Масло
| 7420
| …
| …
| …
| |
^ Состав Расход
^ Код блюда
| Код продукта
| Веc (г)
| 1
| 1
| 200
| 1
| 2
| 40
| 1
| 3
| 30
| 2
| 5
| 80
| …
| …
| …
| | ^ Код блюда
| Порций
| Дата_Р
| 1
| 158
| 1/9/94
| 2
| 144
| 1/9/94
| 3
| 207
| 1/9/94
| 4
| 235
| 1/9/94
| ...
| ...
| ...
| |
Рецепты Поставщики
^ Код блюда
| Рецепт
| 1
| Ломаную очищ…
| 2
| …
| 3
| …
| ...
| ...
| | ^ Код поставщика
| Поставщик
| Код города
| 1
| "Полесье"
| 1
| 2
| "Наталка"
| 1
| 3
| "Хуанхэ"
| 2
| 4
| "Лайма"
| 3
| |
^ Поставки Города
^ Код поставщика
| Код продукта
| Вес (кг)
| Цена
| Дата_П
| 1
| 6
| 120
| 0.45
| 27/8/94
| 1
| 3
| 50
| 1.82
| 27/8/94
| 1
| 2
| 50
| 0.61
| 27/8/94
| 2
| 2
| 100
| 0.52
| 27/8/94
| 2
| 5
| 100
| 2.18
| 27/8/94
| …
| …
| …
| …
| …
| | ^ Код города
| Город
| Страна
| 1
| Киев
| Украина
| 2
| Пекин
| Китай
| 4
| Москва
| Россия
| 5
| Сочи
| Россия
| 3
| Рига
| Латвия
| …
| …
| …
| |
Рис. 3.2.2.1. Преобразование универсального отношения "Питание"
Каждая таблица состоит из однотипных строк и имеет уникальное имя.
Строки имеют фиксированное число полей (столбцов) и значений (множественные поля и повторяющиеся группы недопустимы). Иначе говоря, в каждой позиции таблицы на пересечении строки и столбца всегда имеется в точности одно значение или ничего.
Строки таблицы обязательно отличаются друг от друга хотя бы единственным значением, что позволяет однозначно идентифицировать любую строку такой таблицы.
Столбцам таблицы однозначно присваиваются имена, и в каждом из них размещаются однородные значения данных (даты, фамилии, целые числа или денежные суммы).
Полное информационное содержание базы данных представляется в виде явных значений данных и такой метод представления является единственным.
При выполнении операций с таблицей ее строки и столбцы можно обрабатывать в любом порядке.
Удаление сведений о некоторых поставках или блюдах не приводит к потере сведений о поставщиках.
Включение осуществляется простым добавлением строк в соответствующую таблицу.
Для исключения ссылок на длинные текстовые значения последние обычно нумеруют: нумеруют блюда в больших кулинарных книгах, товары (продукты) в каталогах и т.д. Воспользуемся этим приемом для исключения избыточного дублирования данных и появления ошибок при копировании длинных текстовых значений (рис. 3.2.2.1). Теперь при изменении названия поставщика "Полесье" на "Днепро" исправляется единственное значение в таблице Поставщики. И даже если оно вводится с ошибкой ("Днипро"), то это не может повлиять на связь между поставщиками и продуктами (в связующей таблице Поставки используются номера поставщиков и продуктов, а не их названия).
^