Выбор правильной схемы для таблицы cassandra в CQL3

Мы пытаемся сохранить множество атрибутов для определенного profile_id внутри таблицы (используя CQL3) и не можем понять, какой подход является лучшим:

а. создать таблицу mytable (profile_id, a1 int, a2 int, a3 int, a4 int ... a3000 int) первичный ключ (profile_id);

OR

б. создать МНОЖЕСТВО таблиц, например. создать таблицу mytable_a1 (profile_id, value int) первичный ключ (profile_id); создать таблицу mytable_a2 (profile_id, value int) первичный ключ (profile_id); ... создать таблицу mytable_a3000 (profile_id, value int) первичный ключ (profile_id);

OR

c. создать таблицу mytable (profile_id, a_all text) первичный ключ (profile_id); и просто сохраните 3000 «столбцов» внутри a_all, например: вставьте в mytable (profile_id, a_all) значения (1, «a1: 1, a2: 5, a3: 55, .... a3000: 5»);

OR

d. ни один из вышеперечисленных

Тип запроса, который мы будем выполнять для этой таблицы: выберите * из mytable, где profile_id in (1,2,3,4,5423,44)

Мы попробовали первый подход, и запросы продолжают время ожидания и иногда даже убивают узлы cassandra.


person Pavel    schedule 04.11.2013    source источник


Ответы (1)


Ответом будет использование столбца кластеризации. Столбец кластеризации позволяет создавать динамические столбцы, которые можно использовать для хранения имени атрибута (имя столбца) и его значения (значение столбца).

Стол будет

create table mytable ( 
    profile_id text,
    attr_name text,
    attr_value int,
    PRIMARY KEY(profile_id, attr_name)
)

Это позволяет добавлять вставки вроде

insert into mytable (profile_id, attr_name, attr_value) values ('131', 'a1', 3);
insert into mytable (profile_id, attr_name, attr_value) values ('131', 'a2', 1031);
.....
insert into mytable (profile_id, attr_name, attr_value) values ('131', 'an', 2);

Это было бы оптимальным решением.

Потому что затем вы хотите сделать следующее: «Тип запроса, который мы будем выполнять для этой таблицы: выберите * из mytable, где profile_id in (1,2,3,4,5423,44)»

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

Кроме того, если вы используете драйвер Java DataStax, вы можете выполнять эти запросы асинхронно и одновременно в своем кластере.

Чтобы узнать больше о моделировании данных и драйвере DataStax Java, посетите бесплатное онлайн-обучение DataStax. Стоит посмотреть http://www.datastax.com/what-we-offer/products-services/training/virtual-training

Надеюсь, это поможет.

person Patrick Callaghan    schedule 09.12.2013