При проектировании БД необходимо стремиться к уменьшению избыточности хранимой в ней информации. Это обусловлено следующими причинами:
1. Требование редактируемости БД. Если одна и та же информация хранится в разных местах, то при необходимости ее обновления/удаления придется просмотреть все записи в базе, что в ряде случаев неприемлемо.
2. Требование компактности БД. Дублирование информации приводит к разрастанию БД, что не только расходует место в памяти машины, но и замедляет работу СУБД с такой базой. Использование специальных методов нормализацииБД, которые будут рассмотрены ниже, приводит к резкому сокращению размеров БД. Например, размер справочника телефонов Тулы в исходном виде составляет 10 Мбайт, а после нормализации- менее 3 Мбайт (обратите внимание, что речь идет не о сжатии информации, а только о ее более рациональной организации).
В качестве примера неправильно спроектированной БД рассмотрим базу, в которой нужно хранить данные о покупателях продукции предприятия. Первая структура БД, которая приходит в голову, имеет вид, показанный на Рис. 23.2.
Рис. 27.2 Первоначальная структура БД
Здесь в поле PRODUCT хранится наименование изделия, а в поле FIRMA - наименование покупателя. Вид БД представлен на Рис. 23.3.
PRODUCT
| FIRMA
|
Привод
| ОАО "Электроприбор"
|
Задвижка
| ООО "Арматура"
|
Задвижка
| ОАО "Электроприбор"
|
Привод
| ООО "Арматура"
|
Рис. 27.3. Заполненная БД
Приведенная здесь структура БД является в корне неверной! Предположим, что в связи с модификацией изделие "Привод" теперь называется "Привод 2.0", а ОАО "Электроприбор" было переименовано в ОАО "Электропривод". Для внесения всего одного фактического изменения придется просмотреть все кортежи в БД (а она может оказаться огромной). Так же обстоит дело с поиском и фильтрацией: если необходимо узнать, какие клиенты покупают приводы, придется выполнять последовательный поиск во всей БД. Индексирование здесь не сильно поможет: в индексированной базе записи с одинаковыми значениями ключевого поля располагаются одна за одной и для прохода по ним все равно придется использовать медленный цикл с перебором всех записей, начиная с некоторой.