Для чего создают связи между таблицами бд

Руководство по межтабличным связям

Одной из целей создания хорошей структуры базы данных является устранение избыточности (повторения) данных. Для этого нужно распределить данные по нескольким отдельным тематически организованным таблицам, чтобы каждый факт был представлен один раз. В приложении Access будет предоставлен способ сбора разбросанных данных — это делается путем помещения общих полей в связанные таблицы. Чтобы корректно выполнить это действие, нужно понять взаимосвязи между таблицами и описать эти взаимосвязи в базе данных.

В этой статье

Введение

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

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

1. Эта форма содержит данные из таблицы клиентов,

4. и сведений о заказах.

Имя клиента в поле Плательщик получено из таблицы «Клиенты», значения кода заказа и даты заказа — из таблицы «Заказы», наименование товара — из таблицы «Товары», а цена и количество — из таблицы «Заказано». Чтобы можно было передать данные в форму, эти таблицы связаны друг с другом несколькими способами.

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

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

1. Поле «Код сотрудника» отображается в двух таблицах: как первичный ключ.

2. и как внешний ключ.

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

В Access есть три типа связей между таблицами.

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

Чтобы создать отношение «один-ко-многим» в структуре базы данных, добавьте первичный ключ на стороне «один» в таблицу на стороне «многие» в виде дополнительного поля или полей. В данном примере необходимо добавить новое поле — поле «Код» из таблицы «Клиенты» — в таблицу «Заказы» и назвать его «Код клиента». После этого Access сможет использовать номер «Код клиента» из таблицы «Заказы» для поиска клиента каждого заказа.

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

Чтобы представить связь «многие-ко-многим», нужно создать третью (связующую) таблицу, в которой она разбивается на две связи «один-ко-многим». Первичные ключи двух таблиц вставляются в третью таблицу. В результате в третьей таблице сохраняются все экземпляры связи. Например, таблицы «Заказы» и «Продукты» имеют связь «многие-ко-многим», определяемую путем создания двух связей «один-ко-многим» в таблице «Заказано». В одном заказе может быть много продуктов, и каждый продукт может быть указан во многих заказах.

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

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

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

Связи между таблицами предоставляют сведения для структурирования запросов

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

Связи между таблицами предоставляют сведения для структурирования форм и отчетов

При создании формы или отчета в Access используются сведения об уже определенных межтабличных связях, чтобы предоставить пользователю выбор и предварительно заполнить параметры свойств соответствующими значениями по умолчанию.

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

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

Понятие о целостности данных

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

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

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

Обеспечение целостности данных включается для конкретного отношения между таблицами. После активации, Access будет отклонять любые операции, нарушающие целостность данных для этой межтабличной связи. Это означает, что Access будет отклонять как любые обновления, изменяющие целевой объект ссылки, так и удаление такого целевого объекта. Возможно, у вас может быть полностью допустимая потребность в изменении первичного ключа для поставщика, у которого есть заказы в таблице «Заказы». В этом случае необходимо, чтобы Access выполнил автоматическое обновление всех задействованных строк в рамках одной операции. Таким образом, Access гарантирует, что обновление будет полностью завершено, а база данных не будет находиться в несогласованном состоянии, когда некоторые строки обновлены, а другие — нет. Для этого в Access имеется параметр Каскадное удаление связанных записей. Если при включении обеспечения целостности данных был включен параметр Каскадное удаление связанных полей, то при последующем обновлении первичного ключа Access автоматически обновляет все связанные с ним поля.

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

Просмотр связей между таблицами

Чтобы просмотреть межтабличные связи, щелкните Схема данных на вкладке Работа с базами данных. Откроется окно «Схема данных», в котором будут отображены все существующие связи. Если связи еще не были определены или это окно открывается впервые, приложение Access предложит добавить в окно таблицу или запрос.

Вызов окна «Схема данных»

Щелкните «Файл», выберите«Открыть», а затем выберите и откройте базу данных.

На вкладке Работа с базами данных в группе Отношения нажмите кнопку Схема данных.

На вкладке Конструктор в группе Связи нажмите кнопку Все связи.

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

Связь между таблицами представляется как линия между таблицами в окне «Схема данных». Связь, не обеспечивающая целостность данных, отображается как тонкая линия между общими полями, поддерживающими связь. Если выбрать связь, щелкнув линию, то линия станет жирной. Если обеспечить целостность данных для этой связи, линия станет толще на концах. Кроме того, над жирной частью линии с одной стороны связи будет отображаться цифра 1, а с другой стороны — символ бесконечности ( ∞).

Когда открыто окно «Схема данных», на ленте доступны указанные ниже команды.

На вкладке Конструктор в группе Сервис

На вкладке Конструктор в группе Отношения

Добавление таблиц (добавление таблицы в Access 2013 Позволяет показывать в окне «Отношения» выбор таблиц.

Источник

Руководство по проектированию реляционных баз данных (7-9 часть из 15) [перевод]

Продолжение.
Предыдущие части: 1-3, 4-6

7. Связь один-ко-многим.

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

Другой пример связи один-ко-многим – это связь, которая существует между матерью и ее детьми. Мать может иметь множество детей, но каждый ребенок может иметь только одну мать.

(Технически лучше говорить о женщине и ее детях вместо матери и ее детях потому, что, в контексте связи один-ко-многим, мать может иметь 0, 1 или множество потомков, но мать с 0 детей не может считаться матерью. Но давайте закроем на это глаза, хорошо?)

Когда одна запись в таблице А может быть связана с 0, 1 или множеством записей в таблице B, вы имеете дело со связью один-ко-многим. В реляционной модели данных связь один-ко-многим использует две таблицы.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд
Схематическое представление связи один-ко-многим. Запись в таблице А имеет 0, 1 или множество ассоциированных ей записей в таблице B.

Как опознать связь один-ко-многим?

Если у вас есть две сущности спросите себя:
1) Сколько объектов и B могут относится к объекту A?
2) Сколько объектов из A могут относиться к объекту из B?

Если на первый вопрос ответ – множество, а на второй – один (или возможно, что ни одного), то вы имеете дело со связью один-ко-многим.

Примеры.

Некоторые примеры связи один-ко-многим:

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

8. Связь многие-ко-многим.

Связь многие-ко-многим – это связь, при которой множественным записям из одной таблицы (A) могут соответствовать множественные записи из другой (B). Примером такой связи может служить школа, где учителя обучают учащихся. В большинстве школ каждый учитель обучает многих учащихся, а каждый учащийся может обучаться несколькими учителями.

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

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

Создание связи многие-ко-многим.

Связь многие-ко-многим создается с помощью трех таблиц. Две таблицы – “источника” и одна соединительная таблица. Первичный ключ соединительной таблицы A_B – составной. Она состоит из двух полей, двух внешних ключей, которые ссылаются на первичные ключи таблиц A и B.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Все первичные ключи должны быть уникальными. Это подразумевает и то, что комбинация полей A и B должна быть уникальной в таблице A_B.

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

Таблицы “о пиве”.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Таблицы выше связывают поставщиков и пиво связью многие-ко-многим, используя соединительную таблицу. Обратите внимание, что пиво ‘Gentse Tripel’ (157) поставляют Horeca Import NL (157, AC001) Jansen Horeca (157, AB899) и Petersen Drankenhandel (157, AC009). И vice versa, Petersen Drankenhandel является поставщиком 3 видов пива из таблицы, а именно: Gentse Tripel (157, AC009), Uilenspiegel (158, AC009) и Jupiler (163, AC009).

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

Есть еще одна важная вещь на которую нужно знать. Связь многие-ко-многим состоит из двух связей один-ко-многим. Обе таблицы: поставщики пива и пиво – имеют связь один-ко-многим с соединительной таблицей.

Другой пример связи многие-ко-многим: заказ билетов в отеле.

В качестве последнего примера позвольте мне показать как бы могла быть смоделирована таблица заказов номеров гостиницы посетителями.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд
Соединительная таблица связи многие-ко-многим имеет дополнительные поля.

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

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

9. Связь один-к-одному.

В связи один-к-одному каждый блок сущности A может быть ассоциирован с 0, 1 блоком сущности B. Наемный работник, например, обычно связан с одним офисом. Или пивной бренд может иметь только одну страну происхождения.

В одной таблице.

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

В отдельных таблицах.

В редких случаях связь один-к-одному моделируется используя две таблицы. Такой вариант иногда необходим, чтобы преодолеть ограничения РСУБД или с целью увеличения производительности (например, иногда — это вынесение поля с типом данных blob в отдельную таблицу для ускорения поиска по родительской таблице). Или порой вы можете решить, что вы хотите разделить две сущности в разные таблицы в то время, как они все еще имеют связь один-к-одному. Но обычно наличие двух таблиц в связи один-к-одному считается дурной практикой.

Примеры связи один-к-одному.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Проект реляционной базы данных – это коллекция таблиц, которые перелинковываются (связываются) первичными и внешними ключами. Реляционная модель данных включает в себя ряд правил, которые помогают вам создать верные связи между таблицами. Эти правила называются “нормальными формами”. В следующих частях я покажу как нормализовать вашу базу данных.

Какой же вид связи вам нужен?

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

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

А когда у вас есть набор уникальных данных, которые имеют отношение только друг к другу, то храните все в одной таблице. Ваш выбор – связь один-к-одному. Например, у вас есть небольшая коллекция автомобилей и вы хотите хранить информацию о них (цвет, марка, год выпуска и пр.).

Источник

Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)

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

Вы также можете увидеть базы данных SQL в действии, просмотрев SQL scripts, apps and add-ons на рынке Envato.

Напоминание

Введение

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

Существует несколько типов отношений базы данных. Сегодня мы рассмотрим следующее:

При выборе данных из нескольких таблиц с отношениями мы будем использовать запрос JOIN. Существует несколько типов JOIN, и мы собираемся узнать следующее:

Мы также узнаем об оговорках ON и USING.

Отношения один к одному

Предположим, у вас есть таблица для клиентов:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Мы можем поместить информацию об адресе клиента в отдельную таблицу:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Теперь мы имеем отношение между таблицей Customers и таблицей Addresses. Если каждый адрес может принадлежать только одному клиенту, это отношение «Один к одному». Имейте в виду, что такого рода отношения не очень распространены. Наша начальная таблица, которая включала адрес вместе с клиентом, в большинстве случаев могла работать нормально.

Обратите внимание: теперь в таблице Customers есть поле с именем «address_id», которое ссылается на запись соответствия в таблице Address. Это называется «Foreign Key» и используется для всех видов отношений баз данных. Мы рассмотрим этот вопрос позже.

Мы можем показать отношения между клиентскими и адресными записями следующим образом:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

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

Отношения «один ко многим» и «многие к одному»

Это наиболее часто используемый тип отношений. Рассмотрим веб-сайт e-commerce со следующим:

В этих случаях нам необходимо создать отношения «один ко многим». Вот пример:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

У каждого клиента может быть ноль, один или несколько заказов. Но заказ может принадлежать только одному клиенту.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Отношения «многие ко многим»

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

Для этих отношений нам нужно создать дополнительную таблицу:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Таблица Items_Orders имеет только одну цель, а именно, чтобы создать отношение «многие ко многим» между элементами и заказами.

Вот картинка таких отношений:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Если вы хотите включить записи items_orders в график, это может выглядеть так:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Самостоятельные ссылки

Это используется, когда таблица должна иметь отношения с самой собой. Например, у вас есть реферальная программа. Клиенты могут направлять других клиентов на ваш веб-сайт. Таблица может выглядеть так:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Клиенты 102 и 103 были переданы клиентом 101.

На самом деле это может быть похоже на отношение «один ко многим», поскольку один клиент может ссылаться на нескольких клиентов. Также он может выглядеть, как древовидная структура:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Один клиент может ссылаться на ноль, одного или несколько клиентов. К каждому клиенту может обращаться только один клиент, или вообще никто.

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

Foreign Keys

До сих пор мы узнали только о некоторых концепциях. Теперь пришло время воплотить их в жизнь с помощью SQL. Для этой части нам нужно понять, что такое Foreign Keys.

В приведённых выше примерах отношений мы всегда имели эти поля «**** _ id», которые ссылались на столбец в другой таблице. В этом примере столбец customer_id в таблице Orders является столбцом Foreign Key:

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

В базе данных типа MySQL есть два способа создания столбцов внешних ключей:

Чёткое определение Foreign Key

Давайте создадим простую таблицу клиентов:

Теперь таблицу заказов, в которой будет Foreign Key:

Оба столбца (customers.customer_id и orders.customer_id) должны иметь одинаковую структуру данных. Если один является INT, другой не должен быть BIGINT, например.

Обратите внимание, что в MySQL только механизм InnoDB имеет полную поддержку Foreign Keys. Но другие механизмы хранения данных по-прежнему позволят вам указывать их без каких-либо ошибок. Кроме того, столбец Foreign Key индексируется автоматически, если не указать для него другой индекс.

Без явной декларации

Та же таблица заказов может быть создана без явного объявления столбца customer_id как Foreign Key:

Далее мы собираемся узнать о JOIN-запросах.

Визуализация отношений

Моим любимым программным обеспечением для проектирования баз данных и визуализации отношений Foreign Key является MySQL Workbench.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

После разработки базы данных вы можете экспортировать SQL и запустить его на своем сервере. Это очень удобно для больших и сложных баз данных.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

JOIN Queries

Для извлечения данных из базы, имеющей отношения, нам часто приходится использовать JOIN queries.

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

У нас 4 клиента. У одного клиента два заказа, у двух клиентов по одному заказу, а у одного клиента нет заказа. Теперь давайте посмотрим различные виды JOIN queries, которые мы можем запустить в этих таблицах.

Перекрестное соединение

Это тип JOIN query по умолчанию, если условие не указано.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Результатом является так называемый «Cartesian product» таблиц. Это означает, что каждая строка из первой таблицы сопоставляется с каждой строкой второй таблицы. Так как каждая таблица имела 4 строки, мы получили результат из 16 строк.

Ключевое слово JOIN может быть опционально заменено запятой.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Конечно, такой результат не очень полезен. Давайте посмотрим на другие типы соединений.

Обычное соединение

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

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Внутреннее соединение

Когда указано условие соединения, выполняется Inner Join. В этом случае было бы неплохо иметь поле customer_id в обеих таблицах. Результаты должны быть похожими на Natural Join.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

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

Давайте добавим еще несколько условий в запрос.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

ON Clause

Прежде чем перейти к другим типам соединений, нам нужно посмотреть ON clause. Это полезно для помещения условий JOIN в отдельное предложение.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Теперь мы можем отличить условие JOIN от условий WHERE. Но есть и небольшая разница в функциональности. Мы увидим это в примерах LEFT JOIN.

USING Clause

USING clause похоже на предложение ON, но оно короче. Если столбец имеет одинаковое имя в обеих таблицах, мы можем указать его здесь.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

На самом деле это похоже на NATURAL JOIN, поэтому столбец join (customer_id) не повторяется дважды в результатах.

Левое (внешнее) соединение

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Хотя у Энди нет заказов, его запись все ещё отображается. Значения под столбцами второй таблицы имеют значение NULL.

Это полезно для поиска записей, которые не имеют отношений. Например, мы можем искать клиентов, которые не разместили какие-либо заказы.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Всё, что мы сделали, это нашли NULL для order_id.

Также обратите внимание, что ключевое слово OUTER является необязательным. Вы можете просто использовать LEFT JOIN вместо LEFT OUTER JOIN.

Условия

Теперь давайте рассмотрим запрос с условием.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Так что случилось с Энди и Сэнди? LEFT JOIN должен был вернуть клиентов без соответствующих заказов. Проблема в том, что предложение WHERE блокирует эти результаты. Чтобы их получить, мы можем попытаться включить условие NULL.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

У нас Энди, но нет Сэнди. Тем не менее это выглядит не так. Чтобы получить то, что мы хотим, нам нужно использовать ON clause.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Правое (внешнее) соединение

RIGHT OUTER JOIN работает точно так же, но порядок таблиц обратный.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

На этот раз у нас нет результатов NULL, потому что каждый заказ имеет соответствующую запись клиента. Мы можем изменить порядок таблиц и получить те же результаты, что и в LEFT OUTER JOIN.

Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бдДля чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд Для чего создают связи между таблицами бд. Смотреть фото Для чего создают связи между таблицами бд. Смотреть картинку Для чего создают связи между таблицами бд. Картинка про Для чего создают связи между таблицами бд. Фото Для чего создают связи между таблицами бд

Теперь у нас есть эти значения NULL, потому что таблица Customers находится на правой стороне соединения.

Заключение

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

Не забудьте проверить SQL scripts, apps and add-ons на рынке Envato. Вы получите представление о возможностях баз данных SQL, и сможете найти идеальное решение, которое поможет вам в текущем проекте разработки.

Следуйте за нами на Twitter или подпишитесь на Nettuts + RSS Feed для получения лучших обучающих материалов по веб-разработке в Интернете.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *