174
Проектирование имеет значение
как латынь – мертвый язык. Тем не менее ученые все еще находят пользу
в изучении латыни, а некоторые знания нормализации необходимы для ка-
чественного проектирования базы данных.
Неформально схема базы данных нормализована, если все значения столб-
цов зависят только от первичного ключа таблицы, а данные разбиты на не-
сколько таблиц, чтобы избежать повторений.
Один из способов создания нормализованной схемы – начать с построе-
ния модели «сущность–связь»: если сущности определены правильно, схе-
ма базы данных,
созданная из этой модели, будет нормализована. Можно
сказать, что модель «сущность–связь» неявно включает в себя обнаружение
зависимостей. Если она не нормализована, обычно это означает, что какие-
то сущности отсутствуют.
Действительно ли важно нормализовать схему базы данных? Улучшает ли
это производительность? Как обычно, все зависит от обстоятельств.
Повышение производительности
не
является основной целью нормализа-
ции. Нормализация создает чистую логическую структуру и помогает обеспе-
чить целостность данных, особенно когда она поддерживается ограничения-
ми ссылочной целостности. Нормализация необходима по тем же причинам,
что и реляционная модель: не
столько для хранения данных, сколько для
обеспечения целостности и возможности использовать язык реляционных
запросов. Отображение между логической структурой и структурой хране-
ния не обязательно взаимно однозначно. В идеале для приложения должна
быть предусмотрена чистая логическая структура, основанная на структуре
хранения, оптимизированной для производительности.
С другой стороны, в мире есть много всего денормализованного, для чего
нормализация не дает никаких преимуществ. Самый известный пример –
почтовый адрес. Почтовый адрес США состоит из улицы с домом, города,
почтового индекса и штата.
Адрес не является нормализованным. Это знают все, кто когда-либо от-
правлял посылки через киоски-автоматы USPS. Автоматическая
проверка
не позволит вам ввести почтовый индекс, не совпадающий с уже введенным
адресом. Однако мы сомневаемся, что кто-то решит нормализовать адреса,
хранящиеся в таблице базы данных.
Часто в поддержку денормализованной структуры данных приводится
аргумент, что «соединения требуют времени» и поэтому денормализация
необходима, чтобы запросы выполнялись быстрее. Для коротких запросов,
когда они построены правильно, дополнительное время на соединения не-
значительно, как мы обсуждали в главе 5, и не следует жертвовать ради него
точностью данных.
Во многих же случаях нормализация позволяет улучшить производитель-
ность, например когда нужно выбрать отдельные значения некоего атрибу-
та с высокой избирательностью или, в общем случае, любое подмножество
столбцов с повторяющимися значениями в ненормализованной таблице.
В
схеме
postgres_air
статус рейсов в таблице
flight
указывается явно. Это
означает, что для получения списка возможных статусов рейсов необходимо
выполнить следующий запрос:
SELECT DISTINCT status FROM flight