На Горох
Информатика, 11 класс

§ 14. Многотабличные базы данных

"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.

Объяснение темы В оглавлении: § 14. Многотабличные базы данных

Кратко о теме

Многотабличная база данных хранит сведения не в одной большой таблице, а в нескольких таблицах, связанных ключами. Такое устройство помогает не дублировать одни и те же данные и сохранять их согласованность: например, название издательства можно записать один раз, а в таблице книг хранить ссылку на него. Чтобы читать сведения из разных таблиц, нужно понимать, как работают первичный и внешний ключи и чем отличаются типы связей между записями.

Объяснение темы

Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.

Определения и обозначения

Многотабличная база данных — база, в которой сведения хранятся в нескольких связанных таблицах. Таблицы разделяют по типам объектов: например, данные об учениках помещают отдельно от сведений о классах. Такое устройство помогает не повторять одни и те же данные в каждой записи и упрощает их обновление.

Первичный ключ — поле или набор полей, однозначно определяющих запись таблицы. Например, номер ученика может отличать одного ученика от всех остальных. Значения ключа не должны повторяться или отсутствовать: иначе по ним нельзя надёжно найти нужную запись.

Внешний ключ — поле одной таблицы, ссылающееся на первичный ключ другой таблицы. Так, номер класса в записи об ученике указывает на конкретный класс. Внешний ключ связывает таблицы, не заставляя заново записывать в каждой из них все сведения о связанном объекте.

Связь таблиц — соответствие записей разных таблиц, задаваемое ключами. Если значение внешнего ключа совпало со значением первичного ключа, можно определить, какие записи относятся друг к другу. По этому соответствию объединяют нужные поля, например имя ученика и название его класса.

Как это устроено

Данные разделяют на таблицы, когда в одной таблице начинают многократно повторяться сведения об одном и том же объекте. Например, если название издательства записано в каждой строке о книге, его изменение потребует исправить много записей. Отдельная таблица издательств позволяет хранить название один раз, а в таблице книг оставить ссылку на нужное издательство. Так снижается вероятность опечаток и противоречий.

Первичный ключ выбирают так, чтобы по его значению можно было безошибочно отличить любую запись от остальных. Для этого подходит уникальный и стабильный признак, например специально назначенный номер. Название или фамилия часто не годятся: они могут повторяться, а некоторые значения со временем меняются. Если одного поля недостаточно, ключом делают комбинацию нескольких полей, уникальную только вместе.

Внешний ключ помещают в таблицу, которой нужно указать на запись другой таблицы. Например, в каждой записи об ученике хранится номер класса, а сами сведения о классах находятся отдельно. Совпадение этого номера с первичным ключом таблицы классов позволяет найти нужный класс. Если записать номер, которого в таблице классов нет, ссылка окажется недействительной; поэтому соответствие значений проверяют при вводе и изменении данных.

Тип связи показывает, скольким записям одной таблицы может соответствовать запись другой. При связи «один к одному» каждой записи соответствует не более одной записи второй таблицы; при связи «один ко многим» одной записи соответствуют многие. При связи «многие ко многим» несколько записей каждой таблицы могут быть связаны с несколькими записями другой. Различие важно при проектировании: от него зависит, где хранить внешний ключ и нужна ли дополнительная таблица.

Чтобы получить сведения, лежащие в разных таблицах, находят записи с совпадающими значениями связанных ключей и выбирают нужные поля. Например, можно сопоставить номер класса в записи ученика с номером в таблице классов, а затем вывести имя ученика и название класса. Такое объединение не означает, что данные физически переписываются в одну таблицу: база формирует общий результат на основе совпадений. Поэтому корректные ключи необходимы и для хранения, и для запросов.

Типы связей между таблицами

ХарактеристикаОдин к одномуОдин ко многимМногие ко многим
Сколько записей одной таблицы соответствует записи другойНе более однойНесколькоНесколько с обеих сторон
Пример предметной областиЧеловек и его паспортКласс и ученикиУченики и кружки
Как задаётся связь ключамиВнешний ключ с ограничением уникальностиВнешний ключ в таблице на стороне «многие»Два внешних ключа в связующей таблице
Как реализуется в структуре базы данныхКлючи двух таблиц сопоставляются попарноУ многих записей может повторяться ссылка на одну записьОтдельная таблица хранит пары связанных записей

Пользуйтесь таблицей, чтобы определить, сколько записей могут быть связаны и где должен находиться внешний ключ. Для связи «многие ко многим» ищите в структуре отдельную таблицу-посредник. Пример в конкретной базе может отличаться, но способ представления связи определяется числом соответствующих записей.

Разбор задач

Задача 1. В таблице «Классы» хранятся номера классов, а в таблице «Ученики» — ученики и номер их класса. Определите первичный и внешний ключи. Сначала выясним, какое поле различает записи о классах, а затем найдём поле, которое указывает на класс из записи об ученике.

  1. В таблице «Классы» номер класса идентифицирует запись, если номера не повторяются. Значит, это первичный ключ.
  2. В таблице «Ученики» номер ученика должен однозначно определять ученика и выступает первичным ключом, если такое поле есть.
  3. Поле с номером класса в таблице «Ученики» указывает на запись таблицы «Классы». Оно является внешним ключом.

Ответ: номер класса в таблице «Классы» — первичный ключ, а номер класса в таблице «Ученики» — внешний ключ. Для полной идентификации ученика нужен собственный уникальный ключ, например номер ученика.

Задача 2. Составьте две таблицы для хранения сведений о книгах и издательствах так, чтобы название издательства не повторялось в каждой записи о книге. Разделим данные по сущностям: отдельно опишем книги и отдельно — издательства. Для связи будем использовать идентификатор издательства, а не повторяющееся текстовое название.

  1. Создадим таблицу «Издательства» с полями «Код издательства» и «Название». Код назначим уникальным и используем как первичный ключ.
  2. Создадим таблицу «Книги» с полями «Код книги», «Название книги» и «Код издательства». Код книги будет первичным ключом.
  3. Поле «Код издательства» в таблице «Книги» зададим как внешний ключ, ссылающийся на код в таблице «Издательства».

Ответ: название издательства хранится один раз в таблице «Издательства», а в записи книги находится ссылка на него. При выводе сведений о книге и издательстве таблицы объединяют по коду издательства.

Задача 3. В базе хранятся ученики и кружки; каждый ученик может посещать несколько кружков, а в каждом кружке занимается несколько учеников. Предложите структуру таблиц и способ получить список участников одного кружка. Здесь нельзя поместить единственный номер кружка в запись ученика: тогда не получится указать все кружки, которые он посещает.

  1. Создадим таблицу «Ученики» с первичным ключом «Код ученика» и таблицу «Кружки» с первичным ключом «Код кружка».
  2. Добавим таблицу «Участие» с полями «Код ученика» и «Код кружка». Оба поля будут внешними ключами на соответствующие таблицы.
  3. Чтобы найти участников выбранного кружка, отберём в таблице «Участие» строки с его кодом. По кодам учеников найдём записи в таблице «Ученики» и возьмём их имена.

Ответ: связь «многие ко многим» представляется через таблицу «Участие». Список участников получают, сопоставляя код кружка и код ученика с записями основных таблиц.

Типичные ошибки

Считать любое поле подходящим первичным ключом — ошибка: фамилия, название или дата могут повторяться, а некоторые значения меняются. Так думают, если смотрят только на текущие записи и не учитывают новые. Проверьте кандидат на ключ: он должен различать каждую запись и оставаться надёжным при изменении остальных данных. Если таких гарантий нет, используйте специально назначенный идентификатор.

Путать первичный и внешний ключ — значит смешивать две разные роли. Первичный ключ идентифицирует запись в своей таблице, внешний указывает на запись в другой. Проверьте, где находится поле и что оно делает: если по нему находят саму запись, это первичный ключ; если оно ведёт к другой таблице, это внешний.

Записывать во внешний ключ значение, которого нет среди ключей связанной таблицы, нельзя: ссылка будет вести к несуществующему объекту. Ошибка часто возникает при ручном вводе или удалении записи, на которую ещё ссылаются. Проверьте каждое значение внешнего ключа поиском в поле первичного ключа связанной таблицы. Для необязательной связи поле может быть пустым, если это допускает структура базы.

Пытаться задать связь «многие ко многим» одним внешним ключом не получится: одно поле не опишет все сочетания записей. Это происходит, когда связь представляют слишком упрощённо, например указывают в таблице ученика только один кружок. Проверьте, могут ли обе стороны иметь несколько соответствий; если да, создайте связующую таблицу с двумя внешними ключами.

Связь с другими темами

Для работы с многотабличной базой нужно знать устройство таблицы: поле задаёт характеристику объекта, запись содержит данные об одном объекте, а тип данных определяет допустимые значения поля. Эти понятия помогают понять, какие сведения хранить в каждой таблице. Также нужно уметь выбирать ключи и проверять, что записи различаются.

Связи используют при проектировании баз данных, чтобы определить состав таблиц и избежать лишних повторов. Они нужны и при составлении запросов, которые получают сведения сразу из нескольких таблиц. Понимание ключей позволяет проверить, откуда взялись результаты запроса и почему запись могла не попасть в выборку.

Что запомнить

  • В многотабличной базе данные распределены по таблицам, связанным ключами.
  • Первичный ключ однозначно определяет запись таблицы.
  • Внешний ключ ссылается на первичный ключ другой таблицы.
  • Внешний ключ помогает избежать повторного хранения одних и тех же сведений.
  • Связь «один ко многим» обычно задают внешним ключом на стороне «многие».
  • Связь «многие ко многим» реализуют с помощью связующей таблицы.
  • Чтобы объединить данные, сопоставляют значения связанных ключей.

Частые вопросы по теме

Зачем хранить данные в нескольких таблицах, а не в одной?

Разделение уменьшает повторение одних и тех же сведений. Если данные об объекте изменились, их достаточно исправить в одном месте, поэтому меньше риск получить противоречия.

Может ли первичный ключ состоять из нескольких полей?

Да, первичным ключом может быть комбинация полей, если только вместе они однозначно определяют запись. Например, в таблице посещений уникальной может быть пара «номер ученика — номер кружка».

Обязательно ли значение внешнего ключа должно совпадать с первичным ключом другой таблицы?

Да, если внешний ключ заполнен, его значение должно соответствовать значению первичного ключа связанной таблицы. Иначе ссылка ведёт на несуществующую запись.

Как представить связь «многие ко многим»?

Для неё создают отдельную связующую таблицу. В ней хранят внешние ключи, указывающие на записи обеих основных таблиц.

Как получить данные, которые находятся в разных таблицах?

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

Спросить по теме параграфа

§ 14. Многотабличные базы данных

Эта же тема в других учебниках

Учебник

Оглавление →
Предмет
Информатика
Класс
11 класс
Учебник
"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.