#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