2013-11-19 2 views
3

cassandra: можете ли вы запросить поле коллекции?cassandra: можете ли вы запросить поле коллекции?

скажите, хотите ли вы сохранить список друзей в таком поле, можете ли вы выполнить запрос по строкам: где user_id = xxx и friend = 'bob'?

Если коллекция не подходит для этого, что такое правильный способ отслеживания друзей в cassandra?

ответ

2

Вторичные индексы по-прежнему пока не поддерживается, но развитие продолжается (CASSANDRA-4511)

В вашей модели, если вы знаете user_id вы могли бы принести пользователю и проверить, если «боб» в их списке друзей в сторона приложения. Если вам нужно запросить, является ли person_A друзьями с person_B, вы можете извлечь коллекцию в свою собственную таблицу, но для этой модели потребуется выполнить 2 запроса.

CREATE TABLE friends (
    user_id text, 
    friend text, 
    PRIMARY KEY(user_id, friend) 
); 
CREATE INDEX idx_friends on friends (friend); 

Допустим, есть результат из приведенной выше таблицы, как:

user_id | friend 
---------+-------- 
    daniel | bob 
    daniel | jack 
    jack | bob 

Если вы хотите, чтобы найти все люди, следуя боб, вы можете использовать SELECT * FROM friends WHERE friend='bob'. Вы могли бы на самом деле сделать это тоже без вторичного индекса и использования ALLOW FILTERING, но это может привести к непредсказуемой производительности:

опция Разрешить ФИЛЬТРАЦИЮ позволяет явным образом разрешить (некоторые) запросы, которые требуют фильтрации. Обратите внимание, что запрос с использованием ALLOW FILTERING может иметь непредсказуемую производительность (для определения выше), то есть даже запрос, который выбирает несколько записей, может демонстрировать производительность, которая зависит от общего объема данных, хранящихся в кластере.

Docs for ALLOW FILTERING.

Смежные вопросы