Как смоделировать таблицу для выполнения запроса на основе поля состояния, которое меняется со временем - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время у нас есть таблица, которую мы запрашиваем с использованием shipment_id, и в будущем нам нужно будет выполнить запрос на основе поля состояния Текущая таблица:

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) 
); 

CREATE INDEX shipment_id_index ON shipment (tenant_id);

Текущий запрос

1) SELECT *ОТ отгрузки, где tenant_id =? 0 РАЗРЕШИТЬ ФИЛЬТРАЦИЮ;

2) ВЫБРАТЬ * ОТ ОТПРАВКИ, ГДЕ shipment_id =? 0 и tenant_id =? 1;

Список ожидающих / будущих запросов

списокидентификаторов отгрузки для данного кода состояния на данный момент 3) SELECT * FROM отгрузки ГДЕ tenant_id = 'y' и status_code = x?;

4) список идентификаторов отгрузки для данного кода состояния за последнюю 1 неделю

5) список идентификаторов отгрузки, для которых получено задержка

Над таблицей Может быть 10-15 уникальных арендаторов и будут иметь 1 shipment_id, 1 tenant_id 1 строка на таблицу и код статуса будет меняться с течением времени по мере отгрузки, начиная с Shipment_started, shipment_progress, shipment_delayed, shipment_delayed_completed и shipment_completed и т. Д. Каждая партия в течение срока ее службы будет проходить через 3-5статусы, текущая таблица будет обновляться только при изменении статуса для данного идентификатора shipment_id.

Мне нужно создать новую таблицу, которая может обращаться к запросу, как показано ниже

3) списокотгрузки для данного арендатора, которые имеют status_code = 'x' на данный момент

4) список отгрузок для данного арендатора, которые имеют status_code = 'x' за последнюю 1 неделю

5) списокотгрузок на которые задержали?

1 Ответ

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

В 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

...