Неэффективное использование памяти является основным недостатком ненормализованных таблиц, поэтому удаление избыточных полей из таблиц является одним из решений этой проблемы.
Правило 1: каждое поле таблицы должно представлять уникальный тип информации.
Это правило означает, что необходимо избавиться от повторяющихся полей и разделить составные поля на отдельные элементы данных. В нашем примере составные поля адреса нужно разделить на простые поля и включить в проект еще несколько таблиц для устранения повторения информации о книгах. В таблицы, созданные для повторяющихся данных, следует включить «ключевую» информацию из основной таблицы, чтобы можно было установить связи между новыми таблицами и исходной. Одно из возможных решений приведено на рис. 8.7.
Заказчики и заказы
Дата заказа | Имя заказчика | Адрес заказчика | Город заказчика | Район или область заказчика | Почтовый индекс заказчика | Страна заказчика |
Телефон заказчика | Общая стоимость | Название магазина | Адрес магазина | Город магазина | Район или область магазина | Почтовый индекс магазина | Телефон магазина |
Содержание заказа
Дата заказа | Имя заказчика | Название книги | Количество книг | Цена | Скидка | Розничная цена |
Книги
Название книги | Предполагаемая цена | Год издания | Порядковый номер издания | Количество страниц | Аннотация | Диск |
Книги и авторы
Название книги | Фамилия автора | Имя автора | Отчество автора | Сведения об авторе | Адрес электронной почты автора |
Рис. 8.7 Проект базы данных Книги, в котором удалены
избыточные поля
Эти таблицы намного проще, поскольку теперь можно обрабатывать единственную запись на каждую заказанную книгу. К тому же не нужно резервировать в записи заказа дополнительные места для хранения большого числа книг. Если потребуется найти книгу с наибольшей ценой, достаточно просмотреть отдельную таблицу Книги, в которой основные сведения о каждой книге записываются только один раз.
Однако в некотором смысле проблема дублирования данных даже расширилась, поскольку теперь в каждой записи таблицы Содержание заказа повторяются поля Дата заказа и Имя заказчика. Потенциально длинное поле Название книги в таблицах Книги, Книги и авторы и Содержание заказа также избыточно. Но эти «повторяющиеся» данные необходимы для поддержания связей между таблицами. Разрешить проблему поможет следующее правило нормализации.