В Cassandra вы моделируете свои таблицы на основе ваших запросов, поэтому вы можете фактически создать таблицу для каждого запроса, который вы можете выполнить.Кроме того, использование ALLOW FILTERING
в ваших запросах - это то, что следует использовать только для целей разработки и тестирования, а не в вашем реальном приложении разработки (ответ здесь: Cassandra CQLEngine Allow Filtering ).
Таким образом, для каждого из упомянутых вами случаев / запросов я предлагаю следующее:
1) SELECT * FROM shipment where tenant_id=?0 ALLOW FILTERING;
это должно быть указано в следующей таблице:
CREATE TABLE shipment (
tenant_id text,
shipment_id text,
actual_arrival_time text,
actual_dep_time text,
email_ids set,
is_deleted boolean,
modified_by text,
modified_time timestamp,
planned_arrival_time text,
planned_dep_time text,
route_id text,
shipment_departure_date text,
status_code text,
PRIMARY KEY (tenant_id, shipment_id)
);
здесьtenant_id
- это partition key
, поэтому, если вы выполняете запрос: SELECT * FROM shipment where tenant_id='x';
, вам больше не нужно использовать ALLOW FILTERING
.
Обновление: У меня естьтакже добавлен shipment_id
как часть первичного ключа для обработки того же cardinality
в случае, если tenant_id
не уникален, так что primary key
должен состоять из tenant_id
и shipment_id
, чтобы избежать перезаписи записей с одинаковымиtenant_id
Согласно комментарию @Himanshu Ahire.
2)SELECT * FROM shipment WHERE shipment_id='x' and tenant_id='y';
это должно быть указано в следующей таблице:
CREATE TABLE shipment (
shipment_id text,
tenant_id text,
actual_arrival_time text,
actual_dep_time text,
email_ids set,
is_deleted boolean,
modified_by text,
modified_time timestamp,
planned_arrival_time text,
planned_dep_time text,
route_id text,
shipment_departure_date text,
status_code text,
PRIMARY KEY ((shipment_id, tenant_id))
);
здесь shipment_id
и tenant_id
оба используются как ключ составного раздела
3) SELECT * FROM shipment WHERE tenant_id = 'y' and status_code = 'x';
4) list of shipment id's for given status code for last 1 week
5) list of shipment id's for which got delayed
они должны быть рассмотрены в следующей таблице:
CREATE TABLE shipment (
status_code text,
tenant_id text,
shipment_id text,
actual_arrival_time text,
actual_dep_time text,
email_ids set,
is_deleted boolean,
modified_by text,
modified_time timestamp,
planned_arrival_time text,
planned_dep_time text,
route_id text,
shipment_departure_date text,
PRIMARY KEY ((tenant_id, status_code), actual_arrival_time)
) WITH CLUSTERING ORDER BY (actual_arrival_time DESC);
здесь вы также должны использовать оба tenant_id
и status_code
как composite partition key
и actual_arrival_time
как clustering column
, чтобы вы могли легко создавать запросы, такие как:
3) SELECT * FROM shipment WHERE tenant_id = 'y' and status_code = 'x';
4) SELECT * FROM shipment WHERE tenant_id = 'y' and status_code = 'x' and actual_arrival_time >= 'date of last week';
5) SELECT * FROM shipment WHERE tenant_id = 'y' and status_code = 'x' and actual_arrival_time > planned_arrival_time;
просто примечание для запроса № 4, вы можете отправить дату последней недели из кода вашего приложения или используя функции cql