Запросы в Кассандре CQL - PullRequest
       57

Запросы в Кассандре CQL

0 голосов
/ 18 декабря 2018

Я новичок в Кассандре.Предположим, у меня есть таблица с именем customer с полями id в качестве первичного ключа, возраста, имени и фамилии.Также примите это, поскольку в этой таблице так много данных.Как можно запросить в этой таблице, чтобы получить мой senario как, «поисковый запрос. Это оператор выбора, чтобы получить ниже senarios.»

  1. данные с имеют как firstname = "что-то" и фамилия= "что-то", то есть запрос для удовлетворения как
  2. Если firstname = null и lastname = 'что-то, что мы дали'
  3. , если lasttname = null, и firstname'something, что мы дали '

Как мы можем запросить с помощью одного оператора запроса cql, который удовлетворяет обоим 3 условиям.

Есть ли способ, .....

1 Ответ

0 голосов
/ 19 декабря 2018

Вы не можете достичь результата одним запросом.Это намного отличается от СУБД, таких как MySQL.Существуют некоторые основные правила.

  1. 1-е основное правило: нельзя запрашивать поле, если оно не упомянуто в первичном ключе.Чтобы иметь возможность запрашивать неосновные поля, вы должны упомянуть РАЗРЕШИТЬ ФИЛЬТР , что не рекомендуется и в первую очередь опровергает цель использования C * для более быстрого чтения.Вы можете использовать вторичный индекс для неосновных столбцов, но есть некоторые компромиссы (вы должны знать, где его использовать).

  2. 2-е правило, если имеется более одного первичногоключ, вы должны упомянуть поля в WHERE последовательно.Вы не можете выполнить запрос с помощью ключа кластеризации, не упоминая ключ раздела, или не можете запросить по 2-му ключу кластеризации, не упомянув раздел и 1-й ключ кластеризации в предложении WHERE и так далее.(Я предполагаю, что вы изучили основные вещи и знаете термины раздел или кластеризация * ключ 1018 *).

  3. Первичные ключи не могут быть NULL.

Ниже приведен пример.

create table users(
    id text,
    firstname text,
    lastename text,
    primary key(id)
);

Если ваша схема такая же, как выше, то вы можете запрашивать только по 'id'.

select * from users where id = ?;

вы не можете запросить по имени или фамилии (они не упоминаются как ключевые).

create table users(
    id text,
    firstname text,
    lastename text,
    primary key(firstname, id)
);

Здесь вы можете запросить по firstname или имя и идентификатор .

select * from users where firstname = ? ;
select * from users where firstname = ? and id = ?;

1-й запрос удовлетворяет 2-е требование поиска по имени.(Точно так же, как это вам понадобится другая таблица, где фамилия в качестве ключа раздела для вашего третьего требования.) Вы не можете делать запросы только по id , экранируя firstname .С помощью ALLOW FILTERING вы можете запросить по id .

select * from users where id = ? ALLOW FILTERING;
create table users(
    id text,
    firstname text,
    lastename text,
    primary key(firstname, lastename, id)
);

Здесь вы можете запросить по firstname и фамилия и id .

select * from users where firstname = ?;
select * from users where firstname = ? and lastname = ?;
select * from users where firstname = ? and lastname = ? and id = ?;

2-й запрос удовлетворяет ваше 1-е требование.

Сводка: Вам потребуется как минимум 3 таблицы и денормализация / копирование всех данных в 3 таблицы для обслуживания вашегозапрос.Вы можете использовать только одну таблицу и индексировать те другие поля, где она подходит, но производительность будет ухудшаться.Материализованное представление (таблица на запрос) намного быстрее, чем вторичный индекс.Самое главное, здесь вы можете искать только точное совпадение.Частичное совпадение (, например, или % ключевых слов в MySQL) здесь не будет работать.Важно знать распределенную природу и ее внутреннюю архитектуру, которая поддерживает модель данных, описанную выше.

...