Хранилища широких колонок (Cassandra, ScyllaDB): как выбрать ключ и чем опасны tombstones?
В Cassandra и совместимых хранилищах первичный ключ состоит из ключа раздела и ключей кластеризации: первый определяет, на каком узле лежат данные, вторые — порядок строк внутри раздела. Отсюда главное правило: таблица проектируется под конкретный запрос, и денормализация с несколькими таблицами под разные запросы — норма, а не ошибка. Запрос без ключа раздела превращается в обход всего кластера (ALLOW FILTERING — почти всегда признак неверной модели). Второе, что нужно знать: удаление не удаляет данные, а пишет tombstone — маркер удаления, который живёт gc_grace_seconds (по умолчанию 10 дней) и участвует в чтении. Поэтому очередь на Cassandra — классический антипаттерн: чтение начала раздела просматривает тысячи маркеров и деградирует. Дополнительные ограничения: размер раздела держат в пределах сотни мегабайт, а согласованность настраивается кворумами на каждый запрос.