Кассандра композитный указатель и компактные хранилища
Я новичок в Кассандре, еще не запускал, но моя бизнес-логика требует создания такой таблицы.
CREATE TABLE Index(
user_id uuid,
keyword text,
score text,
fID int,
PRIMARY KEY (user_id, keyword, score); )
WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;
Это возможно или нет? У меня есть только один столбец (fID), который не является частью моего составного индекса, поэтому я надеюсь, что смогу применить параметр compact_storage. Обратите внимание, что я заказал по третьему столбцу моего составного индекса, а не по второму. Мне также нужно сжать хранилище, чтобы ключевые слова не повторялись для каждого FID.
1 ответ
Несколько вещей изначально о вашем CREATE TABLE
заявление:
- Это будет ошибка на точку с запятой (
;
) после вашего первичного определения ключа. - Вам нужно будет выбрать новое имя, так как
Index
это зарезервированное слово.
Обратите внимание, что я заказал по третьему столбцу моего составного индекса, а не по второму.
- Вы не можете пропустить ключ кластеризации при указании
CLUSTERING ORDER
,
Тем не менее, я вижу вариант здесь. В зависимости от требований вашего запроса, вы можете просто изменить порядок keyword
а также score
в вашем определении первичного ключа, и тогда это будет работать:
CREATE TABLE giveMeABetterName(
user_id uuid,
keyword text,
score text,
fID int,
PRIMARY KEY (user_id, score, keyword)
) WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;
Таким образом, вы можете запросить user_id
и ваши строки (ключевые слова?) для этого пользователя будут упорядочены score
:
SELECT * FROM giveMeABetterName WHERE `user_id`=1b325b66-8ae5-4a2e-a33d-ee9b5ad464b4;
Если это не сработает для вашей бизнес-логики, возможно, вам придется ретушировать модель данных. Но невозможно пропустить ключ кластеризации при указании CLUSTERING ORDER
,
редактировать
Но переупорядочение столбцов у меня не работает. Могу ли я сделать что-то подобное
WITH CLUSTERING ORDER BY (keyword asc, score desc)
Давайте посмотрим на некоторые варианты здесь. Я создал таблицу с вашим оригинальным ПЕРВИЧНЫМ КЛЮЧОМ, но с этим КЛАСТЕРНЫМ ЗАКАЗОМ. Технически это будет работать, но посмотрим, как это относится к моим образцам данных (ключевые слова видеоигр):
aploetz@cqlsh:stackru> SELECT * FROM givemeabettername WHERE user_id=dbeddd12-40c9-4f84-8c41-162dfb93a69f;
user_id | keyword | score | fid
--------------------------------------+------------------+-------+-----
dbeddd12-40c9-4f84-8c41-162dfb93a69f | Assassin's creed | 87 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | Battlefield 4 | 9 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | Uncharted 2 | 91 | 0
(3 rows)
С другой стороны, если я изменю ПЕРВИЧНЫЙ КЛЮЧ на кластер на score
сначала (и соответственно измените CLUSTERING ORDER), тот же запрос возвращает это:
user_id | score | keyword | fid
--------------------------------------+-------+------------------+-----
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 91 | Uncharted 2 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 87 | Assassin's creed | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 9 | Battlefield 4 | 0
Обратите внимание, что вы хотите изменить тип данных score
от TEXT к числовому (int/bigint), чтобы избежать ASCII-бетической сортировки, например так:
user_id | score | keyword | fid
--------------------------------------+-------+------------------+-----
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 91 | Uncharted 2 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 9 | Battlefield 4 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 87 | Assassin's creed | 0
Что-то, что может вам помочь, это прочитать этот документ DataStax по составным ключам и кластеризации.