2013-09-21 6 views
0

Предполагая, что записи всех людей идентифицированы с помощью UUID, и все группы идентифицируются с помощью UUID. Какую модель данных вы создадите, когда вам нужно будет часто запрашивать список всех людей в группе и список всех групп, к которым принадлежит человек. т.е.Хранение группы лиц в группе cassandra

create table membership (
    person_uuid uuid, 
    group_uuid uuid, 
    joined bigint, 
    primary key (person_uuid, group_uuid)); 

выше будет оптимизировать для запросов от человека, и ниже будет оптимизировать для запроса группы.

create table membership (
    group_uuid uuid, 
    person_uuid uuid, 
    joined bigint, 
    primary key (group_uuid, person_uuid)); 

Есть аккуратный способ справиться, так что вы можете оптимально запросить по person_uuid и group_uuid без использования «позволяет фильтровать», то есть:

select group_uuid from membership where person_uuid=? 
select person_uuid from membership where group_uuid=? allow filtering 

Вы просто идти вперед и хранить два копии данных для запросов в обоих направлениях, это имеет проблемы атомарности, хотя верно?

ответ

0

@Jacob

Что вы можете сделать, это создать вторичный индекс на второй кластерной составляющей первичного ключа, чтобы иметь возможность запросить на него.

create table membership (
    person_uuid uuid, 
    group_uuid uuid, 
    joined bigint, 
    primary key (person_uuid, group_uuid)); 

create index on membership(group_uuid); 

Конечно, то вам нужно добавить разрешить фильтрацию на запрос, но это будет гораздо быстрее, чем без индекса.

Если вы решили использовать 2 индексные таблицы данных без использования вторичного индекса, вы можете использовать атомную партия при вставке данных, чтобы гарантировать атомарность

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