Программирование Базы данных
| |
Начинающий проектировщик будет
использовать отношение "Питание" (рис. 4.2)
в качестве завершенной БД. Действительно,
зачем разбивать отношение "Питание" на
несколько более мелких отношений (см.
например, рис. 3.2),
если оно заключает в себе все данные? А
разбивать надо потому, что при
использовании универсального отношения
возникает несколько проблем:
-
Избыточность.
Данные практически всех столбцов
многократно повторяются. Повторяются и
некоторые наборы данных (Блюдо-Вид-Рецепт,
Продукт-Калорийность, Поставщик-Город-Страна).
Нежелательно повторение рецептов,
некоторые из которых намного больше
рецепта "Лобио" (см. рис. 2.3).
И уж совсем плохо, что все данные о блюде (включая
рецепт) повторяются каждый раз, когда это
блюдо включается в меню.
-
Потенциальная
противоречивость (аномалии обновления).
Вследствие избыточности можно обновить
адрес поставщика в одной строке, оставляя
его неизменным в других. Если поставщик
кофе сообщил о своем переезде в Харбин и
была обновлена строка с продуктом кофе, то у
поставщика "Хуанхэ" появляется два
адреса, один из которых не актуален.
Следовательно, при обновлениях необходимо
просматривать всю таблицу для нахождения и
изменения всех подходящих строк.
-
Аномалии
включения. В БД не может быть записан
новый поставщик ("Няринга", Вильнюс,
Литва), если поставляемый им продукт (Огурцы)
не используется ни в одном блюде. Можно,
конечно, поместить неопределенные значения
в столбцы Блюдо, Вид, Порций и Вес (г) для
этого поставщика. Но если появится блюдо, в
котором используется этот продукт, не
забудем ли мы удалить строку с
неопределенными значениями? По аналогичным причинам нельзя
ввести и новый продукт (например, Баклажаны),
который предлагает существующий поставщик
(например, "Полесье"). А как ввести
новое блюдо, если в нем используется новый
продукт (Крабы)?
-
Аномалии удаления.
Обратная проблема возникает при
необходимости удаления всех продуктов,
поставляемых данным поставщиком или всех
блюд, использующих эти продукты. При таких
удалениях будут утрачены сведения о таком
поставщике.
Многие проблемы этого примера
исчезнут, если выделить в отдельные таблицы
сведения о блюдах, рецептах, расходе блюд,
продуктах и их поставщиках, а также создать
связующие таблицы "Состав" и "Поставки"
(рис. 4.3).
Блюда
Блюдо |
Вид
|
Лобио |
Закуска |
Харчо |
Суп |
Шашлык |
Горячее |
Кофе |
Десерт |
... |
... |
|
Рецепты
Блюдо |
Рецепт
|
Лобио |
Ломаную очищ |
... |
... |
|
Расход
Блюдо |
Порций |
Дата_Р
|
Лобио |
158 |
1/9/94 |
Харчо |
144 |
1/9/94 |
Шашлык |
207 |
1/9/94 |
Кофе |
235 |
1/9/94 |
... |
... |
... |
|
Продукты
Продукт |
Калор.
|
Фасоль |
3070 |
Лук |
450 |
Масло |
7420 |
Зелень |
180 |
Мясо |
1660 |
... |
... |
|
Состав
Блюдо |
Продукт |
Вес (г)
|
Лобио |
Фасоль |
200 |
Лобио |
Лук |
40 |
Лобио |
Масло |
30 |
Лобио |
Зелень |
10 |
Харчо |
Мясо |
80 |
... |
... |
... |
|
Поставщики
Поставщик |
Город |
Страна
|
"Полесье" |
Киев |
Украина |
"Наталка" |
Киев |
Украина |
"Хуанхэ" |
Пекин |
Китай |
"Лайма" |
Рига |
Латвия |
"Юрмала" |
Рига |
Латвия |
... |
... |
... |
|
Поставки
Поставщик |
Город |
Продукт |
Вес (кг) |
Цена ($) |
Дата_П
|
"Полесье" |
Киев |
Томаты |
120 |
0.45 |
27/8/94 |
"Полесье" |
Киев |
Масло |
50 |
1.62 |
27/8/94 |
"Полесье" |
Киев |
Лук |
50 |
0.61 |
27/8/94 |
"Наталка" |
Киев |
Лук |
100 |
0.52 |
27/8/94 |
... |
... |
... |
... |
... |
... |
|
Рис. 4.3. Преобразование
универсального отношения "Питание" (первый
вариант)
Включение. Простым
добавлением строк (Поставщики; "Няринга",
Вильнюс, Литва) и (Поставки; "Няринга",
Вильнюс, Огурцы, 40) можно ввести информацию
о новом поставщике. Аналогично можно ввести
данные о новом продукте (Продукты;
Баклажаны, 240) и (Поставки; "Полесье",
Киев, Баклажаны, 50).
Удаление. Удаление сведений о
некоторых поставках или блюдах не приводит
к потере сведений о поставщиках.
Обновление. В таблицах рис. 4.3
все еще много повторяющихся данных,
находящихся в связующих таблицах (Состав и
Поставки). Следовательно, в данном варианте
БД сохранилась потенциальная
противоречивость: для изменения названия
поставщика с "Полесье" на "Днепро"
придется изменять не только строку таблицы
Поставщики, но и множество строк таблицы
Поставки. При этом не исключено, что в БД
будут одновременно храниться: "Полесье",
"Палесье", "Днепро", "Днипро"
и другие варианты названий.
Кроме того, повторяющиеся
текстовые данные (такие как название блюда
"Рулет из телячей грудинки с сосисками и
гарниром из разноцветного пюре" или
продукта "Колбаса московская
сырокопченая") существенно увеличивают
объем хранимых данных.
Для исключения ссылок на длинные
текстовые значения последние обычно
нумеруют: нумеруют блюда в больших
кулинарных книгах, товары (продукты) в
каталогах и т.д. Воспользуемся этим приемом
для исключения избыточного дублирования
данных и появления ошибок при копировании
длинных текстовых значений (рис. 4.4). Теперь
при изменении названия поставщика "Полесье"
на "Днепро" исправляется единственное
значение в таблице Поставщики. И даже если
оно вводится с ошибкой ("Днипро"), то
это не может повлиять на связь между
поставщиками и продуктами (в связующей
таблице Поставки используются номера
поставщиков и продуктов, а не их названия).
Блюда
БЛ |
Блюдо |
Вид
|
1 |
Лобио |
Закуска |
2 |
Харчо |
Суп |
3 |
Шашлык |
Горячее |
4 |
Кофе |
Десерт |
... |
... |
... |
|
Рецепты
Блюдо |
Рецепт
|
Лобио |
Ломаную очищ |
... |
... |
|
Расход
Блюдо |
Порций |
Дата_Р
|
Лобио |
158 |
1/9/94 |
Харчо |
144 |
1/9/94 |
Шашлык |
207 |
1/9/94 |
Кофе |
235 |
1/9/94 |
... |
... |
... |
|
Продукты
ПР |
Продукт |
Калор.
|
1 |
Фасоль |
3070 |
2 |
Лук |
450 |
3 |
Масло |
7420 |
4 |
Зелень |
180 |
5 |
Мясо |
1660 |
... |
... |
... |
|
Состав
БЛ |
ПР |
Вес (г)
|
1 |
1 |
200 |
1 |
2 |
40 |
1 |
3 |
30 |
1 |
4 |
10 |
2 |
5 |
80 |
... |
... |
... |
|
Поставщики
ПОС |
Поставщик |
Город |
Страна
|
1 |
"Полесье" |
Киев |
Украина |
2 |
"Наталка" |
Киев |
Украина |
3 |
"Хуанхэ" |
Пекин |
Китай |
4 |
"Лайма" |
Рига |
Латвия |
5 |
"Юрмала" |
Рига |
Латвия |
... |
... |
... |
... |
|
Поставки
ПОС |
ПР |
Вес (кг) |
Цена ($) |
Дата_П
|
1 |
6 |
120 |
0.45 |
27/8/94 |
1 |
3 |
50 |
1.62 |
27/8/94 |
1 |
2 |
50 |
0.61 |
27/8/94 |
2 |
2 |
100 |
0.52 |
27/8/94 |
... |
... |
... |
... |
... |
|
Рис. 4.4. Преобразование
универсального отношения "Питание" (второй
вариант)
[ << Назад ] [ Содержание ] [ Далее >> ]
|