Связывание таблиц в базах данных в Python
Пусть у нас есть таблица с именами юзеров и городами, в которых они живут:
| 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, которая будет ссылаться
на город юзера.
Итак, давайте сделаем две таблицы. Таблица с городами:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Таблица с юзерами:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
Практические задачи
Пусть вам нужно хранить товары (название, цена, количество) и категории этих товаров. Распишите структуру хранения.
Пусть вам нужно хранить реки и моря, в которые впадают эти реки. Распишите структуру хранения.
Пусть вам нужно хранить города и страны, в которых они находятся. Распишите структуру хранения.