# Связывание таблиц в базах данных

Пусть у нас есть таблица с именами юзеров и городами, в которых они живут:

users
id | name | city
--- | --- | ---
1 | user1 | city1
2 | user2 | city1
3 | user3 | city2
4 | user4 | city1
5 | user5 | city3
6 | user6 | city2

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

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

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

А теперь представим, что в базе `10000` юзеров из `10` городов - ради этих `10` городов нам придется достать всю таблицу из огромного количества строк - получится очень медленная операция с бессмысленной тратой ресурсов.

## Решение проблемы

Нужно разбить нашу таблицу на две: в одной будут хранится города, а во второй - юзеры. При этом в таблице с юзерами будет колонка `city_id`, которая будет ссылаться на город юзера.

Итак, давайте сделаем две таблицы. Таблица с городами:

cities
id | name
--- | ---
1 | city1
2 | city2
3 | city3

Таблица с юзерами:

users
id | name | city_id
--- | --- | ---
1 | user1 | 1
2 | user2 | 1
3 | user3 | 2
4 | user4 | 1
5 | user5 | 3
6 | user6 | 2

Пусть вам нужно хранить товары (название, цена, количество) и категории этих товаров. Распишите структуру хранения.

Пусть вам нужно хранить реки и моря, в которые впадают эти реки. Распишите структуру хранения.

Пусть вам нужно хранить города и страны, в которых они находятся. Распишите структуру хранения.

←→
↑