2015-05-07 4 views
2

Я нахожусь в моем исследовании для хранения журналов в Кассандре.
Схема для журналов будет примерно такой.Использование Cassandra для данных временных рядов

EDIT: Я изменил схему, чтобы внести некоторые разъяснения.

CREATE TABLE log_date (
    userid bigint, 
    time timeuuid, 
    reason text, 
    item text, 
    price int, 
    count int, 
    PRIMARY KEY ((userid), time) - #1 
    PRIMARY KEY ((userid), time, reason, item, price, count) - #2 
); 

Новый стол будет создан каждый день каждый день. Итак, таблица содержит журналы только на один день.

Мое условие запроса заключается в следующем.
Запросить все журналы от определенного пользователя в определенный день (дата не время).
Таким образом, причина, значение, цена, счет не будут использоваться в качестве подсказок или условий для запросов вообще.

Мой вопрос в том, какой дизайн PRIMARY KEY подходит лучше.
EDIT: И ключом здесь является то, что я хочу хранить журналы в схематическом виде.

Если я выберу # 1, будет создано столько столбцов для каждого журнала. И возможность иметь больше значений для журнала очень высока. Схема, приведенная выше, является лишь примером. Журнал может содержать такие значения, как subreason, friendid и т. Д.

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

Какой из них выбрать? Пожалуйста помоги.

+0

Разницы между клавишами: HTTP: // StackOverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clustering-key-in-cassandra –

ответ

16

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

Вместо этого я бы рекомендовал создать единую таблицу и раздел по ID_пользователю и день и использовать один раз UUID, как кластерном колонки для события, пример этого будет выглядеть следующим образом:

CREATE TABLE log_per_day (
    userid bigint, 
    date text, 
    time timeuuid, 
    value text, 
     PRIMARY KEY ((userid, date), time) 
) 

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

Объявляя кластерную колонку time, вы можете иметь широкую строку, в которую вы можете вставить как можно больше событий за один день.

Значок строки - это composite key идентификатора пользователя и плюс дата в тексте, например.

insert into log_per_day (userid, date, time, value) values (1000,'2015-05-06',aTimeUUID1,'my value')

insert into log_per_day (userid, date, time, value) values (1000,'2015-05-06',aTimeUUID2,'my value2')

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

Кроме того, если вы хотите получить больше информации о временных рядах я настоятельно рекомендую вам проверить Getting Started with Time Series Data Modeling

Надеются, что это помогает,

Хосе Луису

+0

Спасибо, но мой вопрос не в том, что касается раздела или кластеризации, но и для хранения остальной части журнала схематически. –

+0

Я согласен с @jbarrueta для разбиения/кластеризации. Что касается хранения остальной части данных журнала, Поскольку он может быть переменным, u имеет два возможных подхода: 1. Тип данных карты для хранения в виде пар ключ-значение 2. данные как json, хранящиеся в формате текстовых данных. P.S. : Второй подход облегчает требования к памяти. – ininprsr

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