Родственные связи в Kotlin
Пусть нужно хранить отцов и сыновей. Каждый отец может иметь только одного сына, а сын в свою очередь тоже может иметь одного сына.
Первая идея - сделать две таблицы: parents
для отцов и sons для сыновей. Затем
связать эти таблицы полем son_id или
parent_id.
Эта идея не очень хорошая: один и тот же человек может быть одновременно и отцом, и сыном. Придется хранить его в обеих таблицах, а это неудобно, занимает больше места и легко приводит к ошибкам.
Лучше связать таблицу саму с собой: сделать
таблицу users, хранить в ней всех юзеров
и каждому сделать поле son_id, в котором
будет храниться id сына из этой же таблицы:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Запросы
Давайте напишем запрос, который достанет юзера вместе с его сыном.
Для начала достанем юзеров:
SELECT
*
FROM
users
Теперь присоединим к юзерам их сыновей. Таблицу джойнят саму к себе, поэтому ее переименовывают:
LEFT JOIN users AS sons
Теперь можно указать связь основной таблицы и переименованной:
LEFT JOIN users AS sons ON sons.id = users.son_id
Укажем теперь поля. Их тоже переименовывают, чтобы имена не столкнулись:
SELECT
users.name AS user_name, sons.name AS son_name
Собранный запрос выглядит следующим образом:
SELECT
users.name AS user_name, sons.name AS son_name
FROM
users
LEFT JOIN users AS sons ON sons.id = users.son_id
Пусть есть категории. Каждая категория может принадлежать родительской категории, та в свою очередь своей родительской и так далее. Распишите структуру хранения.
Напишите запрос, который достанет категорию вместе с ее родительской категорией.
Напишите запрос, который достанет категорию вместе с ее родителем и прародителем.
Напишите запрос, который достанет категорию вместе с ее родителем, прародителем и прапрародителем.