Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы Данных_all.doc
Скачиваний:
22
Добавлен:
20.02.2016
Размер:
1.76 Mб
Скачать

3.3. Отношение один-ко-многим

К этому моменту мы имеем готовые структуры четырех таблиц базы данных bookbic authors, titles, editors и publishers. Для каждой таблицы описаны атрибуты и определены первичные ключи.

Тем не менее мы пока не определили никаких зависимостей между данными. Пока остается непонятным, как, например, связаны между собой книги и конкретные издательства.

Связь между книгами и издательствами может описываться отношением один-ко-многим: каждая книга имеет единственного издателя, в то время как издатель может выпустить несколько книг. Отношение один-ко-многим часто записывается в виде 1:N.

Столбец titleJd будет являться внешним ключом в таблице publishers. Вы можете использовать его для ссылки на определенные строки в таблице titles и объединения информации о книгах и издателях. К сожалению, это решение уводит- вас в неправильном направлении. Вспомним моделируемое нами отношение — один издатель, много книг — и посмотрим, что произойдет при выходе новой книги. Вы добавите новую строку в таблицу titles с названием книги, ценой и т.д.

Рис. 5. Изменение внешнего ключа

С учетом последних изменений мы получили следующую структуру:

- таблица publishers содержит по одной строке для каждого издателя;

- таблица titles имеет по одной строке на каждую книгу;

- идентификационный номер издателя повторяется в таблице titles, так как издатель может выпустить несколько книг, и при этом обеспечивается минимальная избыточность данных.

Вы можете использовать логическую связь между столбцами pub_id в таблицах titles и publishers для объединения этих таблиц. Другими словами, структура базы разрабатывалась в расчете на применение пользователями оператора объединения для выборки информации из таблиц titles и publishers с помощью одного запроса.

В таблице publishers столбец pubid является первичным ключом. В таблице titles этот столбец выполняет роль внешнего ключа. Таким образом, реляционная модель требует, чтобы отношение один-ко-многим реализовывалось посредством пары первичный ключ—внешний ключ.

3.5 Отношение многий-ко-многим

Определив все отношения вида один-ко-многим в базе данных bookbiz и поставив им в соответствие пары первичный ключ—внешний ключ, рассмотрим другие типы отношений. Например, как связаны между собой авторы и книги?

Некоторые книги написаны несколькими авторами, к тому же некоторые авторы выпустили более одной книги. Другими словами, авторы и книги связаны отношением многий-ко-многим (которое часто записывается в виде N:N и иногда называется соединением (association)). В соответствии с реляционной теорией, соединения должны представляться отдельными таблицами, т.е. в базе данных bookbiz должна быть таблица для авторов, таблица для книг и таблица, описывающая связи между ними.

Таблица titleauthors описывает отношение типа многий-ко-многим между авторами и книгами. Это такая же базовая таблица, как titles и authors, но вместо объектов она описывает связи. Если пользователю базы данных bookbiz. потребуется информация о том, кто написал какую книгу, он или она создаст запрос на объединение, в котором для связи между таблицами titles и authors будет использована таблица titleauthors.

Таблицы titleauthors и titles объединяются по столбцам title_id, titleauthors и authors — по столбцам au_id. Другими словами, title_id в таблице titleauthors является внешним ключом, соответствующим первичному ключу title_id в таблице titles, a au_id в таблице titleauthors является внешним ключом, соответствующим первичному ключу au_id в таблице authors. По общему принципу, сформулированному К. Дж. Дейтом, "в реляционной модели участники соединения определяются внешними ключами, образующими таблицу, представляющую это соединение".

Рис. 6. Таблица соединения для отношения многий-ко-многим

Что является первичным ключом в таблице titleauthors? Идентификатор автора и идентификатор книги не идентифицируют однозначно строки в таблице titleauthors. В ее столбцах повторяются идентификаторы книг, имеющих больше одного автора, и идентификаторы авторов, написавших несколько книг. Тем не менее уникальной является комбинация идентификатор автора—идентификатор книги. Как говорит Дейт: "Для данного соединения, как правило, комбинация всех внешних ключей его участников имеет свойство уникальности". Таким образом, первичным ключом в таблице titleauthors является комбинация titlejd и aujd.

Таблицы editors и titles имеют аналогичные взаимосвязи. Редактор может работать более чем над одной книгой, а у книги может быть несколько редакторов. Это отношение многий-ко-многим также описывается связывающей таблицей.