Для одного order_id в order_items есть 3 строки, а в payments — 2 строки. Вы соединили обе таблицы по order_id без предварительной агрегации. Сколько строк получится для этого заказа и почему?
A5 строк, потому что просто складываются 3 позиции и 2 платежа в общий список без какого-либо умножения комбинаций.
B3 строки, потому что соединение по ключу заказа всегда даёт связь «один к многим» и сохраняет именно число позиций.
C2 строки, потому что записи о платежах «поглощают» позиции при соединении и в результате остаётся только число платежей.
D6 строк, потому что внутри одного
order_id возникает связь «многие ко многим» и происходит размножение строк: 3 × 2 = 6.Правильный ответ. Когда две таблицы обе
one-to-many к одному ключу, их JOIN превращается в many-to-many и даёт join explosion.Разбор
Внутри одного order_id позиции и платежи комбинируются между собой. Каждая из 3 позиций соединится с каждым из 2 платежей, поэтому получится 6 строк. Это типичный источник дублирования в денежных метриках, если затем делать SUM() по такому соединению. Чтобы избежать размножения строк, обычно агрегируют одну из сторон до соединения.
Проверь себя · 1/3разбор после ответа
Вы соединяете таблицы пользователей и заказов по
user_id, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?Ещё вопросы по теме «JOIN и кардинальность»
- В таблице `users` 100 000 строк, в таблице `user_profiles` — ровно одна строка на каждого `user_id`. Вы делаете `INNER JOIN` по `user_id`. Что верно про число строк результата?
- Вы соединяете таблицы пользователей и заказов по `user_id`, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?
- Нужен набор данных на уровне `user_id`: выручка из `orders` и число сессий из `sessions`. В обеих таблицах по пользователю много строк (один-ко-многим). Какой подход минимизирует риск размножения строк в соединении?
- Вы хотели посчитать средний чек по заказам как `AVG(order_total)`. Но перед этим соединили `orders` с `order_items` по `order_id` (связь один-ко-многим). Почему `AVG()` может измениться по сравнению с расчётом на таблице `orders`?
- В каком случае `SUM(order_amount)` после `JOIN` скорее всего останется корректным, без эффекта размножения строк?
- Все вопросы по «JOIN и кардинальность» →