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