Прежде, чем начать изучать соединения таблиц, нужно понять, как строится связь между несколькими таблицами. В этом уроке познакомимся с тем, как хранятся данные в таблицах, как таблицы могут быть связаны между собой.
Данные в таблицах
Как правило, таблицы содержат однотипные данные, которые могут относиться к одной сущности - курсы, пользователи, посты, комментарии. Если добавляется новая сущность, то добавляется новая таблица. Каждая таблица содержит информацию о сущности независимо от других таблиц.
Например, данные из таблицы topics не связаны никак с таблицей users. Но по смыслу они связаны через колонки id в таблице users и user_id в таблице topics
users
id | first_name | last_name |
---|---|---|
1 | Lucienne | Feil |
2 | Ramiro | Wolf |
3 | Maureen | Romaguera |
4 | Jennyfer | Flatley |
5 | Caleigh | Connelly |
6 | Whitney | Jenkins |
7 | Prudence | McGlynn |
8 | Abigale | Turner |
9 | Phyllis | Kassulke |
10 | Kelli | Zemlak |
topics
id | user_id | title |
---|---|---|
29 | 2 | soluta dolor occaecati |
8 | 6 | quam placeat suscipit |
12 | 9 | odio praesentium placeat |
1 | 10 | est iste corporis |
9 | 10 | et recusandae dolores |
Если изменить данные в одной таблице, то в другой они останутся неизменными
UPDATE topics SET user_id = 1337 WHERE id = 29;
SELECT id, first_name, last_name FROM users LIMIT 10 ORDER BY id ASC;
Содержимое таблицы users не изменилось
id | first_name | last_name |
---|---|---|
1 | Lucienne | Feil |
2 | Ramiro | Wolf |
3 | Maureen | Romaguera |
4 | Jennyfer | Flatley |
5 | Caleigh | Connelly |
6 | Whitney | Jenkins |
7 | Prudence | McGlynn |
8 | Abigale | Turner |
9 | Phyllis | Kassulke |
10 | Kelli | Zemlak |
View on DB Fiddle
Аналогично, если удалить строки из таблицы users, то поле user_id в таблице topics не изменится.
DELETE FROM users WHERE id = 6;
SELECT id, first_name, last_name FROM users WHERE id BETWEEN 1 AND 10 ORDER BY id ASC;
Из таблицы users удалена запись с id = 6
id | first_name | last_name |
---|---|---|
1 | Lucienne | Feil |
2 | Ramiro | Wolf |
3 | Maureen | Romaguera |
4 | Jennyfer | Flatley |
5 | Caleigh | Connelly |
7 | Prudence | McGlynn |
8 | Abigale | Turner |
10 | Kelli | Zemlak |
| 9 | Phyllis | Kassulke |
SELECT
id,
user_id,
title
FROM topics
WHERE user_id BETWEEN 1 AND 10
ORDER BY user_id
LIMIT 10;
Содержимое таблицы topics не изменилось
id | user_id | title |
---|---|---|
8 | 6 | quam placeat suscipit |
12 | 9 | odio praesentium placeat |
1 | 10 | est iste corporis |
9 | 10 | et recusandae dolores |
View on DB Fiddle
Мы видим, что таблицы не имеют физической связи. Изменение данных в одной таблице, не приводит к изменениям в других. Но таблицы могут быть связаны по смыслу. Рассмотрим, какие связи бывают
Связь один ко многим
Связь "один ко многим" означает, что каждому элементу из одной таблицы соответствует несколько элементов из другой таблицы. Например, у пользователя может быть несколько топиков (сообщений), но сообщение имеет только одного создателя.
SELECT
id,
first_name,
last_name
FROM users WHERE id = 10;
Запись из таблицы users с id = 10
id | first_name | last_name |
---|---|---|
10 | Kelli | Zemlak |
SELECT
id,
user_id,
title,
body,
created_at
FROM topics
WHERE user_id = 10;
Записи из таблицы topics которые относятся к записи из таблицы users с id = 10
id | user_id | title | body | created_at |
---|---|---|---|---|
1 | 10 | est iste corporis | Architecto id autem modi. | 2022-06-14T12:09:50.532Z |
9 | 10 | et recusandae dolores | iste | 2022-06-14T17:51:46.633Z |
View on DB Fiddle
Один к одному
Связь "один к одному" означает, что каждому элементу из одного набора соответствует только один элемент из другой таблицы. Например, у одного пользователя может быть только один привязанный аккаунт Github
Многие ко многим
Связь "многие ко многим" (или "много к многим") означает, что несколько элементов из одной таблицы могут соответствовать нескольким элементам из другой таблицы. Примером такой связи может быть связь между студентами и курсами. Каждому студенту может соответствовать несколько курсов, и каждый курс может иметь несколько студентов. Таким образом, это создает многие ко многим отношение между студентами и курсами.
Для представления такой связи часто используется связующая таблица, которая содержит значения обоих наборов элементов.
SELECT
id,
user_id,
course_id
FROM course_members
LIMIT 5;
связующая таблица course_members
id | user_id | course_id |
---|---|---|
1 | 26 | 47 |
2 | 85 | 48 |
3 | 37 | 54 |
4 | 5 | 97 |
5 | 27 | 69 |
SELECT
id,
first_name,
last_name
FROM users
WHERE id IN (26, 85, 37, 5, 27)
LIMIT 5;
users
id | first_name | last_name |
---|---|---|
5 | Caleigh | Connelly |
26 | Andy | Huel |
27 | Jarrod | Schumm |
37 | Alvena | Rutherford |
85 | Araceli | Wisozk |
SELECT
id,
name,
body
FROM courses
WHERE id IN (47, 48, 54, 97, 69)
LIMIT 5;
courses
id | name | body |
---|---|---|
47 | voluptates temporibus ipsa | Earum dolorem eius omnis ipsa et tempora quia omnis. |
48 | sed facere officia | quia |
54 | sunt qui quia | porro |
69 | dolor reprehenderit aut | Doloribus molestiae quia eveniet maiores commodi. |
97 | commodi ipsum maxime | Distinctio omnis consequuntur aperiam officia nam. Est sint natus. |
View on DB Fiddle
Таблица course_members является связующей. Она содержит поля user_id и course_id для создания связей между двумя таблицами.
Выводы
В этом уроке мы познакомились с концепцией нескольких таблиц и связей между ними. Повторим ключевые мысли:
- Данные в таблицах хранятся независимо. Если их изменить в одной таблице, то в другой ничего не поменяется
- Таблицы связываются через общее значение полей. Чаще всего связываются через общие по смыслу поля. Например, идентификатор пользователя
- Связь один ко многим означает что у записи из первой таблицы есть несколько связанных записей из другой таблицы. Например, курс и его уроки
- Связь один к одному означает, что у записи из первой таблицы есть только одна связанная запись из другой таблицы. Например, пользователь и его аккаунт в Github
- Для связи многие ко многим используется связующая таблица. Она соединяет несколько записей из первой таблицы и из второй. Например, студенты и курсы, которые они проходят
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.