Моделирование данных Cassandra для запроса по многим столбцам

cassandra database nosql

127 просмотра

1 ответ

1612 Репутация автора

У меня есть вид объекта (записи), который имеет динамические атрибуты (до сотни атрибутов). Учитывая тот факт, что я не знаю, какие атрибуты будет иметь этот объект, потому что он определяется конечными пользователями, я думаю, что я должен использовать тип карты для хранения атрибутов и их значений в Cassandra.

Я хотел бы, чтобы 2 шаблона запроса на данный момент:

  1. Ищите несколько lastзаписей с учетомattribute<X>=<value>
  2. Ищите все записи с заданным attribute<x>=<value>сгруппированным attribute<y>с записанным временем междуtime range

<x>и <y>не определены во время разработки. Это зависит от того, как его определяет конечный пользователь.

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

Итак, мои вопросы: как моделировать ключевые пространства Cassandra для моих требований?

Для дальнейшего обсуждения:

  1. Я думаю о создании разделенных пространств ключей для каждого имени атрибута (когда пользователь определяет одно, я должен был бы создать одно пространство ключей), злоупотребляю ли я пространствами ключей? Я думаю, что я.
  2. Нужно ли полагаться на вторичные индексы?

P / s: Я новичок в Кассандре, так что извините меня, если я неправильно использовал какие-либо термины.

Автор: vutran Источник Размещён: 18.07.2016 10:23

Ответы (1)


1 плюс

1014 Репутация автора

Если я понимаю вашу потребность, вы можете создать таблицу, в recordsкоторой будут храниться общие свойства, такие timeкак статические столбцы, и два поля, nameа valueтакже атрибуты пары ключ-значение.

CREATE TABLE record ( record_id uuid, time date static, name string, value string, PRIMARY KEY (record_id) );

При условии, как есть, эта таблица может быть только запрос record_id. Чтобы добавить больше сложности запроса, вы можете использовать MATERIALIZED VIEW:

CREATE MATERIALIZED VIEW record_by_attribute AS SELECT * FROM record WHERE record_id IS NOT NULL AND name IS NOT NULL PRIMARY KEY ((name, record_id);

С помощью этой структуры вы можете запустить запрос для вашего первого шаблона запроса:

SELECT * FROM record_by_attribute WHERE name = 'an attribute' LIMIT 10;

Для вашей второй необходимости, я думаю, вам нужно создать вторую таблицу для хранения результатов агрегации для всех комбинаций атрибутов (cassandra не поддерживает предложение GROUP BY) и запросить ее, как я сказал выше.

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

Автор: Guillaume S Размещён: 18.07.2016 12:28
Вопросы из категории :
32x32