Таблица CassandraDB с несколькими ключами-значениями

#database #cassandra #scalability #cql

Вопрос:

Я новый пользователь CassandraDB. Я пытаюсь создать таблицу, содержащую 3 статических столбца, например «имя», «город» и «возраст», а затем я думал о двух столбцах «ключ» и «значение», поскольку моя таблица может получать много входных данных. Как я могу определить эту таблицу? Я пытаюсь достичь чего-то масштабируемого, то есть:

Столбцы таблицы -> «Имя», «Город», «Возраст», «Ключ», «Значение»

Имя: Mark

Город: Ливерпуль

Возраст: 26

Ключ: Автомобиль

Значение: Audi A3

Ключ: Задание

Значение: Компьютерный инженер

Ключ: основное хобби

Значение: Футбол

Я ищу ОПРЕДЕЛЕНИЕ ТАБЛИЦЫ .. Любая помощь? Заранее большое вам спасибо.

Комментарии:

1. Пожалуйста, конкретизируйте свой вопрос, запишите полный вариант использования, на который было бы легко ответить.

2. Привет, спасибо за ответ. Я пытаюсь создать определение таблицы. «СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ ОНА НЕ СУЩЕСТВУЕТ (временная метка ts, текст имени, текст возраста …)» Эта вещь. Как я мог бы достичь этой «масштабируемой» таблицы ключ-значение?

Ответ №1:

Если я правильно понимаю, вы хотите создать хранилище ключ-значение, сгруппированное по «имени», «городу» и «возрасту». Существует несколько решений для этого подхода —

Сначала с помощью статических столбцов —

 create table record_by_id(
recordId text,
name text static,
city text static,
age int static,
key text,
value text
primary key (recordId, key)
);
 

Дизайн, имя, город, возраст этой таблицы остаются постоянными для одного и того же идентификатора записи. Вы можете использовать любое количество ключей-значений для одного и того же идентификатора записи.

Второй подход был бы —

 create table record_by_id(
name text ,
city text ,
age int ,
key text,
value text
primary key ((name,city,age),key)
);
 

В этом дизайне имя, город и возраст являются частью ключа раздела. Ключевой столбец является частью ключа кластеризации.

Оба подхода масштабируемы, но первый подход хорош для обслуживания.

Комментарии:

1. Приятно! Похоже, у нас было несколько похожих идей. Великие умы думают одинаково!

2. Большое вам спасибо за ваш ответ, это было так полезно! Я добавлю также временную метку (ts) и «идентификатор».

Ответ №2:

таблица с 3 статическими столбцами

Итак, под «статическим» я предполагаю, что вы не имеете в виду определение статических столбцов Cassandra. Это круто, я знаю, что вы имеете в виду. Но упоминание дало мне представление о том, как подойти к этому:

попытка создать определение таблицы

Я вижу два способа сделать это.

 CREATE TABLE user_properties (
    name TEXT,
    city TEXT STATIC,
    age INT STATIC,
    key TEXT,
    value TEXT,
    PRIMARY KEY (name,key));
 

Поскольку у нас есть статические столбцы (сохраненные только с ключом раздела name ), добавление большего количества ключей / значений — это просто вопрос добавления большего key количества s к одному и тому же name , поэтому вставка данных выглядит следующим образом:

 INSERT INTO user_properties (name,city,age,key,value)
    VALUES ('Mark','Liverpool',26,'Car','Audi A3');
INSERT INTO user_properties (name,key,value)
    VALUES ('Mark','Job','Computer Engineer');
INSERT INTO user_properties (name,key,value)
    VALUES ('Mark','Main hobby','Football');
 

Запрос выглядит следующим образом:

 > SELECT * FROm user_properties WHERE name='Mark';

 name | key        | age | city      | value
------ ------------ ----- ----------- -------------------
 Mark |        Car |  26 | Liverpool |           Audi A3
 Mark |        Job |  26 | Liverpool | Computer Engineer
 Mark | Main hobby |  26 | Liverpool |          Football

(3 rows)
 

Это «простой» способ сделать это.

Или

 CREATE TABLE user_properties_map (
    name TEXT,
    city TEXT,
    age INT,
    kv MAP<TEXT,TEXT>,
    PRIMARY KEY (name));
 

Используя один ключ раздела в качестве ПЕРВИЧНОГО КЛЮЧА, мы можем ВСТАВИТЬ все одним выстрелом:

 INSERT INTO user_properties_map (name,city,age,kv)
    VALUES ('Mark','Liverpool',26,{'Car':'Audi A3',
                                   'Job':'Computer Engineer',
                                   'Main hobby':'Football'});
 

И запрос выглядит так:

 > SELECT * FROm user_properties_map  WHERE name='Mark';

 name | age | city      | kv
------ ----- ----------- --------------------------------------------------------------------------
 Mark |  26 | Liverpool | {'Car': 'Audi A3', 'Job': 'Computer Engineer', 'Main hobby': 'Football'}

(1 rows)
 

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

Но при вводе имени (возможно, потребуется также включить фамилию или что-то еще, чтобы повысить уникальность) данные должны нормально масштабироваться. И рост раздела не будет проблемой, если вы не планируете использовать тысячи пар ключ / значение.

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

Комментарии:

1. Привет, Аарон. Большое вам спасибо за помощь в решении этого вопроса. Я обязательно буду использовать первый подход, поскольку он ближе к моим целям. : D