Рис. 3-3. Нормализованная таблица с уникальным идентификатором
Безусловно, столбцы со сведениями о самих книгах и выпустивших их издательствах можно поместить в одну и ту же таблицу, однако этот способ порождает некоторые проблемы. Для каждой вышедшей в данном издательстве книги придется добавлять и хранить избыточные сведения об издательстве. Эта информация займет дополнительноеместо в базе данных. Если адрес издательства изменится, то соответствующие коррективы придется вносить в запись для каждой книги. Более того, при удалении из таблицы Books последней книги, вышедшей в каком-либо издательстве, сведения об этом издательстве будут потеряны.
Рис. 3-5. Нормализованная структура базы данных, в которой заглавия книг и сведения об издательствах хранятся в разных таблицах
В нормализованной базе данных сведения о книгах и издательствах будут храниться по крайней мере в двух таблицах: в одной сведения о книгах, а в другой — об издательствах (рис. 3-5).
В таблице не должно быть списков значений для некоторой единицы информации. Допустим, требуется учитывать названия и авторов книг. Хотя большинство книг написаны одним автором, их может быть два и более. Если для хранения имени автора в таблице предназначен только один столбец, то возникает проблема. Можно, конечно, хранить имена обоих авторов в одном столбце, но при этом затруднится вывод списка авторов по отдельности. Другое решение — изменить структуру таблицы и добавить еще один столбец для хранения имени второго автора. Но это поможет, только если авторов не более двух. Если же их три, придется добавлять третий столбец.
Рис. 3-6. Две возможные структуры таблицы Books
Если необходимо хранить список значений в одном столбце или создать несколько столбцов для хранения одной единицы информации (Author1, Author2 и т.д.), следует предусмотреть размещение дублирующихся данных в другой таблице, связанной с главной. Для таблицы Books можно создать дополнительную главную таблицу, где хранить сведения об авторах, а затем — третью таблицу, в которой будут сопоставлены названия книг с их авторами. Последняя таблица обеспечивает хранение повторяющихся значений (рис. 3-7). Такая структура позволяет описать книгу с любым числом авторов без изменения определения таблицы и не допускает наличия пустых мест при сохранении информации о книгах с одним автором.
Рис. 3-7. Сведения о книгах и их авторах хранятся в трех таблицах
В реляционных базах данных связи позволяют избежать избыточности данных. Связь работает путем сопоставления данных ключевых столбцов — обычно это столбцы с одинаковыми именами из двух различных таблиц. В большинстве случаев связь сопоставляет первичный ключ одной таблицы (уникальный идентификатор) с элементом внешнего ключ другой таблицы. Первичные ключи и внешние ключи подробно обсуждаются в главе 5.