В events(user_id, event_id) у пользователя может быть много строк, и в orders(user_id, order_id) тоже много строк. Вы соединяете их по user_id. Какая связь получается на ключе и как это влияет на строки?

AЭто many-to-many: строки по каждому user_id перемножаются, и возможен взрывной рост числа строк после соединения
BЭто one-to-one: по каждому user_id после соединения будет ровно одна строка, как при соединении уникальных ключей
CЭто one-to-many: общее число строк после соединения станет равно числу уникальных пользователей в обеих таблицах
DЭто one-to-one, если перед соединением применить DISTINCT к каждой из таблиц по полю user_id
Правильный ответ. Два источника, где по ключу много строк, при JOIN дают many-to-many и риск взрывного роста числа строк.

Разбор

Если у пользователя 5 событий и 2 заказа, после JOIN получится 10 строк только для него — это и есть размножение строк, которое ломает COUNT(*), SUM() и даже AVG() при неверном уровне анализа. Чтобы избежать, выбирают правильный ключ соединения или делают предварительную агрегацию до нужной гранулярности. Варианты one-to-one и one-to-many неверно описывают ситуацию: при многих строках с обеих сторон связь по ключу всегда many-to-many. DISTINCT по user_id теряет данные, а не превращает соединение в one-to-one.

Проверь себя · 1/3разбор после ответа
Вы соединяете таблицы пользователей и заказов по user_id, где у одного пользователя может быть много заказов (связь «один ко многим»). Как посчитать число пользователей, которые сделали хотя бы один заказ, и не получить дубли?
Открыть Карьерник в Telegram

Ещё вопросы по теме «JOIN и кардинальность»