"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Многотабличная база данных хранит сведения не в одной большой таблице, а в нескольких таблицах, связанных ключами. Такое устройство помогает не дублировать одни и те же данные и сохранять их согласованность: например, название издательства можно записать один раз, а в таблице книг хранить ссылку на него. Чтобы читать сведения из разных таблиц, нужно понимать, как работают первичный и внешний ключи и чем отличаются типы связей между записями.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Многотабличная база данных — база, в которой сведения хранятся в нескольких связанных таблицах. Таблицы разделяют по типам объектов: например, данные об учениках помещают отдельно от сведений о классах. Такое устройство помогает не повторять одни и те же данные в каждой записи и упрощает их обновление.
Первичный ключ — поле или набор полей, однозначно определяющих запись таблицы. Например, номер ученика может отличать одного ученика от всех остальных. Значения ключа не должны повторяться или отсутствовать: иначе по ним нельзя надёжно найти нужную запись.
Внешний ключ — поле одной таблицы, ссылающееся на первичный ключ другой таблицы. Так, номер класса в записи об ученике указывает на конкретный класс. Внешний ключ связывает таблицы, не заставляя заново записывать в каждой из них все сведения о связанном объекте.
Связь таблиц — соответствие записей разных таблиц, задаваемое ключами. Если значение внешнего ключа совпало со значением первичного ключа, можно определить, какие записи относятся друг к другу. По этому соответствию объединяют нужные поля, например имя ученика и название его класса.
Данные разделяют на таблицы, когда в одной таблице начинают многократно повторяться сведения об одном и том же объекте. Например, если название издательства записано в каждой строке о книге, его изменение потребует исправить много записей. Отдельная таблица издательств позволяет хранить название один раз, а в таблице книг оставить ссылку на нужное издательство. Так снижается вероятность опечаток и противоречий.
Первичный ключ выбирают так, чтобы по его значению можно было безошибочно отличить любую запись от остальных. Для этого подходит уникальный и стабильный признак, например специально назначенный номер. Название или фамилия часто не годятся: они могут повторяться, а некоторые значения со временем меняются. Если одного поля недостаточно, ключом делают комбинацию нескольких полей, уникальную только вместе.
Внешний ключ помещают в таблицу, которой нужно указать на запись другой таблицы. Например, в каждой записи об ученике хранится номер класса, а сами сведения о классах находятся отдельно. Совпадение этого номера с первичным ключом таблицы классов позволяет найти нужный класс. Если записать номер, которого в таблице классов нет, ссылка окажется недействительной; поэтому соответствие значений проверяют при вводе и изменении данных.
Тип связи показывает, скольким записям одной таблицы может соответствовать запись другой. При связи «один к одному» каждой записи соответствует не более одной записи второй таблицы; при связи «один ко многим» одной записи соответствуют многие. При связи «многие ко многим» несколько записей каждой таблицы могут быть связаны с несколькими записями другой. Различие важно при проектировании: от него зависит, где хранить внешний ключ и нужна ли дополнительная таблица.
Чтобы получить сведения, лежащие в разных таблицах, находят записи с совпадающими значениями связанных ключей и выбирают нужные поля. Например, можно сопоставить номер класса в записи ученика с номером в таблице классов, а затем вывести имя ученика и название класса. Такое объединение не означает, что данные физически переписываются в одну таблицу: база формирует общий результат на основе совпадений. Поэтому корректные ключи необходимы и для хранения, и для запросов.
| Характеристика | Один к одному | Один ко многим | Многие ко многим |
|---|---|---|---|
| Сколько записей одной таблицы соответствует записи другой | Не более одной | Несколько | Несколько с обеих сторон |
| Пример предметной области | Человек и его паспорт | Класс и ученики | Ученики и кружки |
| Как задаётся связь ключами | Внешний ключ с ограничением уникальности | Внешний ключ в таблице на стороне «многие» | Два внешних ключа в связующей таблице |
| Как реализуется в структуре базы данных | Ключи двух таблиц сопоставляются попарно | У многих записей может повторяться ссылка на одну запись | Отдельная таблица хранит пары связанных записей |
Пользуйтесь таблицей, чтобы определить, сколько записей могут быть связаны и где должен находиться внешний ключ. Для связи «многие ко многим» ищите в структуре отдельную таблицу-посредник. Пример в конкретной базе может отличаться, но способ представления связи определяется числом соответствующих записей.
Задача 1. В таблице «Классы» хранятся номера классов, а в таблице «Ученики» — ученики и номер их класса. Определите первичный и внешний ключи. Сначала выясним, какое поле различает записи о классах, а затем найдём поле, которое указывает на класс из записи об ученике.
Ответ: номер класса в таблице «Классы» — первичный ключ, а номер класса в таблице «Ученики» — внешний ключ. Для полной идентификации ученика нужен собственный уникальный ключ, например номер ученика.
Задача 2. Составьте две таблицы для хранения сведений о книгах и издательствах так, чтобы название издательства не повторялось в каждой записи о книге. Разделим данные по сущностям: отдельно опишем книги и отдельно — издательства. Для связи будем использовать идентификатор издательства, а не повторяющееся текстовое название.
Ответ: название издательства хранится один раз в таблице «Издательства», а в записи книги находится ссылка на него. При выводе сведений о книге и издательстве таблицы объединяют по коду издательства.
Задача 3. В базе хранятся ученики и кружки; каждый ученик может посещать несколько кружков, а в каждом кружке занимается несколько учеников. Предложите структуру таблиц и способ получить список участников одного кружка. Здесь нельзя поместить единственный номер кружка в запись ученика: тогда не получится указать все кружки, которые он посещает.
Ответ: связь «многие ко многим» представляется через таблицу «Участие». Список участников получают, сопоставляя код кружка и код ученика с записями основных таблиц.
Считать любое поле подходящим первичным ключом — ошибка: фамилия, название или дата могут повторяться, а некоторые значения меняются. Так думают, если смотрят только на текущие записи и не учитывают новые. Проверьте кандидат на ключ: он должен различать каждую запись и оставаться надёжным при изменении остальных данных. Если таких гарантий нет, используйте специально назначенный идентификатор.
Путать первичный и внешний ключ — значит смешивать две разные роли. Первичный ключ идентифицирует запись в своей таблице, внешний указывает на запись в другой. Проверьте, где находится поле и что оно делает: если по нему находят саму запись, это первичный ключ; если оно ведёт к другой таблице, это внешний.
Записывать во внешний ключ значение, которого нет среди ключей связанной таблицы, нельзя: ссылка будет вести к несуществующему объекту. Ошибка часто возникает при ручном вводе или удалении записи, на которую ещё ссылаются. Проверьте каждое значение внешнего ключа поиском в поле первичного ключа связанной таблицы. Для необязательной связи поле может быть пустым, если это допускает структура базы.
Пытаться задать связь «многие ко многим» одним внешним ключом не получится: одно поле не опишет все сочетания записей. Это происходит, когда связь представляют слишком упрощённо, например указывают в таблице ученика только один кружок. Проверьте, могут ли обе стороны иметь несколько соответствий; если да, создайте связующую таблицу с двумя внешними ключами.
Для работы с многотабличной базой нужно знать устройство таблицы: поле задаёт характеристику объекта, запись содержит данные об одном объекте, а тип данных определяет допустимые значения поля. Эти понятия помогают понять, какие сведения хранить в каждой таблице. Также нужно уметь выбирать ключи и проверять, что записи различаются.
Связи используют при проектировании баз данных, чтобы определить состав таблиц и избежать лишних повторов. Они нужны и при составлении запросов, которые получают сведения сразу из нескольких таблиц. Понимание ключей позволяет проверить, откуда взялись результаты запроса и почему запись могла не попасть в выборку.
Зачем хранить данные в нескольких таблицах, а не в одной?
Разделение уменьшает повторение одних и тех же сведений. Если данные об объекте изменились, их достаточно исправить в одном месте, поэтому меньше риск получить противоречия.
Может ли первичный ключ состоять из нескольких полей?
Да, первичным ключом может быть комбинация полей, если только вместе они однозначно определяют запись. Например, в таблице посещений уникальной может быть пара «номер ученика — номер кружка».
Обязательно ли значение внешнего ключа должно совпадать с первичным ключом другой таблицы?
Да, если внешний ключ заполнен, его значение должно соответствовать значению первичного ключа связанной таблицы. Иначе ссылка ведёт на несуществующую запись.
Как представить связь «многие ко многим»?
Для неё создают отдельную связующую таблицу. В ней хранят внешние ключи, указывающие на записи обеих основных таблиц.
Как получить данные, которые находятся в разных таблицах?
Нужно сопоставить значения внешнего и первичного ключей, а затем объединить нужные поля из найденных записей. В запросе к базе данных это обычно делают с помощью операции соединения таблиц.
§ 14. Многотабличные базы данных