Последнее состояние сущности в ClickHouse
Вопрос
Нужно хранить в ClickHouse текущий статус заказов, статусы меняются много раз. Как это сделать и какие подводные камни?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Модель вставки новых версий вместо UPDATE
ReplacingMergeTree(version) с ORDER BY по ключу заказа
Дедупликация только при слияниях: в запросах FINAL или argMax
Версии в разных партициях не схлопываются: партиционирование по неизменному полю
Удаления через флаг is_deleted (поддерживается в ReplacingMergeTree)
Альтернативы: CollapsingMergeTree, хранение истории и витрина
Что могут спросить следом
- Что быстрее: FINAL или argMax?
- Как удалить заказ?
Разбор
Образцовый ответ: «Обновления в ClickHouse делаются вставкой новой версии строки. Беру ReplacingMergeTree с колонкой версии, например updated_at или монотонный номер, и ORDER BY по order_id. При слияниях остаётся строка с максимальной версией, но слияния происходят когда-нибудь, поэтому запросы обязаны учитывать дубли: SELECT FINAL или argMax(status, version) с группировкой по order_id. Важная тонкость: строки схлопываются только внутри одной партиции, поэтому партиционировать надо по полю, которое у заказа не меняется, например по дате создания, а не по дате изменения. Для удаления есть колонка-признак удаления в ReplacingMergeTree. Если нужна и история, храню все версии в обычной таблице, а текущее состояние строю отдельно».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.