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

§ 5. Связи между таблицами

"Информатика (в 2-х частях)", Горячев А.В., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Чернышёва Т.Л., Широков Д.В.

Объяснение темы В оглавлении: § 5. Связи между таблицами

Кратко о теме

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Разбор задач

Ученики и классы

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

  1. В таблице «Классы» выбираем ключевое поле, например «Код класса». Оно должно иметь отдельное значение для каждого класса, чтобы по коду можно было найти ровно одну запись.

  2. В таблице «Ученики» ищем поле, которое хранит код класса ученика. Это поле можно назвать «Код класса»; его значения будут повторяться у учеников одного класса.

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

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

Товары и категории

Условие. Одна категория включает много товаров, а каждый товар относится к категории. Значит, записи не распределяются поровну: одной записи категории соответствует несколько записей товаров. Нужно разместить ключ там, где он позволит указать категорию для каждой отдельной позиции.

  1. В таблице «Категории» выбираем уникальный идентификатор, например «Код категории». Он позволяет точно отличить одну категорию от другой, даже если названия похожи.

  2. В таблицу «Товары» добавляем поле «Код категории». Для каждой товарной записи в нём указываем код подходящей категории.

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

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

Ученики и кружки

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

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

  2. Создаём промежуточную таблицу «Запись на кружки» и добавляем в неё поля «Код ученика» и «Код кружка». Они являются внешними ключами и ссылаются на записи обеих исходных таблиц.

  3. Для каждой пары, например ученика и посещаемого им кружка, добавляем отдельную строку. Если ученик выбрал три кружка, для него будет три строки; у кружка также может быть много строк с разными учениками.

Ответ. Связь «многие ко многим» реализуется через таблицу «Запись на кружки» с внешними ключами обеих таблиц. Она хранит каждую пару ученика и кружка, поэтому не приходится помещать несколько идентификаторов в одно поле.

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

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

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

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

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

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

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

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

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

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

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

Зачем нужны связи между таблицами, если все данные можно записать в одну таблицу?

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

Чем ключевое поле отличается от внешнего ключа?

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

В какой таблице размещают внешний ключ при связи «один ко многим»?

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

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

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

Что произойдёт, если удалить запись, на которую ссылаются другие таблицы?

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

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

§ 5. Связи между таблицами

Учебник

Оглавление →
Предмет
Информатика
Класс
9 класс
Учебник
"Информатика (в 2-х частях)", Горячев А.В., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Чернышёва Т.Л., Широков Д.В.