Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpRlFR 230 of 299 menu
◀ ▶

Родственные связи в Kotlin

Пусть нужно хранить отцов и сыновей. Каждый отец может иметь только одного сына, а сын в свою очередь тоже может иметь одного сына.

Первая идея - сделать две таблицы: parents для отцов и sons для сыновей. Затем связать эти таблицы полем son_id или parent_id.

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

Лучше связать таблицу саму с собой: сделать таблицу users, хранить в ней всех юзеров и каждому сделать поле son_id, в котором будет храниться id сына из этой же таблицы:

users
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

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

Напишите запрос, который достанет категорию вместе с ее родительской категорией.

Напишите запрос, который достанет категорию вместе с ее родителем и прародителем.

Напишите запрос, который достанет категорию вместе с ее родителем, прародителем и прапрародителем.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить