Таблицы в PostgreSQL
Предварительное планирование
Прежде чем переходить к непосредственному созданию таблиц, желательно выде-ить немного времени на предварительное планирование объектов базы данных, также на выбор имени, типа и смысла каждого поля в таблице. В результате пла-ирования схема выбора имен становится более стройной и последовательной, это, в свою очередь, приводит к появлению более наглядных и "вразумительных" команд и запросов.
Кроме перечисленных семантических факторов (имена, типы и смысл полей), необходимо проследить за четким установлением связей между таблицами. Проектирование связей является важной частью процесса проектирования таблиц, поскольку любые ошибки в этой области – как дублирование больших объемов данных, так и случайное исключение важных данных из таблиц – являются крайне нежелательными.
Вернемся к таблице books базы данных booktown, структура которой приведена табл. 3.1. В полях каждой записи хранится внутренний код книги, название, код автора и код темы. Обратите внимание: вместо полного имени автора и текстового писания темы в таблице хранятся простые целочисленные коды, используемые ля связи с двумя другими таблицами: authors и subjects. Содержимое этих таблиц частично иллюстрируют табл. 3.26 и 3.27.
Таблица 3.26. Таблица authors.
id | last_name | first_name |
---|---|---|
1809 | Geisel | Theodor Seuss |
illl | Denham | Ariel |
15990 | Bourgeois | Paulette |
2031 | Brown | Margaret Wise |
25041 | Margery Williams | Bianco |
16 | Alcoa | Louisa May |
115 | Poe | Edgar Allen |
Таблица 3.27. Таблица subjects.
id | subject | location |
---|---|---|
1809 | Arts | Creativity St |
1111 | Children's Books | Kids Ct |
15990 | Classics | Academic Rd |
2031 | Computers | Productivity Ave |
25041 | Drama | Main St |
16 | Horror | Black Raven Dr |
115 | Science Fiction | Main St |
Вынесение данных об авторе и теме из таблицы books повышает эффективность хранения данных. Если в таблице имеются данные о нескольких книгах, относящихся к одной теме, то вместо нескольких экземпляров полных данных, связанных с темой, в таблице будут храниться только значения subjected. Кроме того, это упрощает модификацию данных, связанных с темой книги (например, информации о размещении этих книг на полках магазина). Такие данные достаточно один раз изменить в одной небольшой таблице вместо того, чтобы обновлять множество записей в основной базе. Аналогичные рассуждения применимы и к таблице authors, связанной с books по полю authorjd.
Тщательное планирование также помогает избежать ошибок при выборе типов данных. Например, таблица editions связывает коды ISBN с кодами книг, хранящимися в таблице booktown. На первый взгляд кажется, что для представления кодов ISBN можно воспользоваться полем типа integer, однако такое решение было бы ошибочным, поскольку коды ISBN иногда содержат символьные данные. Кроме того, в поле типа integer будут теряться начальные нули (код 0451160916 превратится в 451160916).
Из всего сказанного можно сделать вывод, что проектирование таблиц является важной составляющей процесса проектирования базы данных.