У меня есть данные, которые выглядят так:
select * from test;
department | employee | batch_number | hash
------------+----------+--------------+-------
dep1 | Bart | 1 | hash1
dep1 | Bart | 1 | hash2
dep1 | Lisa | 3 | hash3
dep1 | Lisa | 4 | hash4
dep1 | John | 5 | hash5
dep1 | Lucy | 6 | hash6
dep1 | Bart | 7 | hash7
dep1 | Bart | 7 | hash8
И я хотел бы запросить данные с помощью предложения where
для batch_number
, ordering
для batch_number
и предиката in
для employee
.
В реляционной базе данных это будет выглядеть как
select * from test
where department='dep1'
and employee in ('Bart','Lucy','John')
and batch_number >= 2
order by batch_number desc
limit 3;
department | employee | batch_number | hash
------------+----------+--------------+-------
dep1 | Bart | 7 | hash7
dep1 | Bart | 7 | hash8
dep1 | Lucy | 6 | hash6
У меня возникли некоторые проблемы при моделировании таблицы для этого запроса в Кассандре. department
будет моим ключом раздела, а hash
должен быть частью первичного ключа. Но я борюсь с ключами кластера и / или ((SSTable присоединен) вторичными) индексами.
Поскольку я хочу заказать на batch_number
Я попытался включить его в качестве ключа кластера:
CREATE TABLE keyspace.test(
department TEXT,
batch_number INT,
hash TEXT,
employee TEXT,
PRIMARY KEY ((department), batch_number, hash)
) WITH CLUSTERING ORDER BY (batch_number DESC);
CREATE INDEX tst_emp ON keyspace.test (employee);
Но это не учитывает запросы с предикатом in
в моем индексе:
select * from keyspace.test where department='dep1' and employee in ('Bart','Lucy','John');
InvalidRequest: Error from server: code=2200 [Invalid query] message="IN predicates on non-primary-key columns (employee) is not yet supported"
Поэтому я попытался добавить столбец employee
в качестве ключа кластера:
CREATE TABLE keyspace.test(
department TEXT,
batch_number INT,
hash TEXT,
employee TEXT,
PRIMARY KEY ((department), batch_number, hash, employee)
) WITH CLUSTERING ORDER BY (batch_number DESC);
Но это терпит неудачу, потому что я не могу поместить отношение не-EQ в batch_number
:
select * from keyspace.test where department='dep1' and batch_number > 1 and employee in ('Bart','Lucy','John');
InvalidRequest: Error from server: code=2200 [Invalid query] message="Clustering column "employee" cannot be restricted (preceding column "batch_number" is restricted by a non-EQ relation)"
Но всякий раз, когда я ставлю employee
перед batch_number
, я теряю способность заказывать batch_number
:
CREATE TABLE keyspace.test(
department TEXT,
employee TEXT,
batch_number INT,
hash TEXT,
PRIMARY KEY ((department), employee, batch_number, hash)
);
select * from keyspace.test where department='dep1' and employee in ('Bart','Lucy','John') ORDER BY batch_number DESC;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Order by currently only support the ordering of columns following their declared order in the PRIMARY KEY"
Так, какой дизайн таблицы учитывал бы такой запрос?
Можно ли это сделать на Кассандре?
Edit:
Другие запросы, которые я хотел бы выполнить для этой таблицы:
select * from keyspace.test where department='X' and batch_number=Y
и
delete from keyspace.test where department='X'