Для одного 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() по такому соединению. Чтобы избежать размножения строк, обычно агрегируют одну из сторон до соединения.
Можно заниматься бесплатно
Готовим вопросы…
Три вопроса по теме этой страницы, с объяснениями.
Ещё вопросы по теме «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 и кардинальность» →