Дизайн первичного ключа Cassandra для обслуживания запроса диапазона

Я разработал семейство столбцов

prodgroup text, prodid int, status int`` ПЕРВИЧНЫЙ КЛЮЧ ((prodgroup), prodid, status)

Модель данных предназначена для обслуживания

  • Получить список товаров из товарной группы
  • получить список продуктов для заданного диапазона идентификаторов
  • Получите подробную информацию о конкретном продукте
  • Обновить статус продукта активен / неактивен
  • Получить список активных или неактивных продуктов (выберите * из продукта, где prodgroup = 'xyz' и prodid> 0 и status = 0)

Дизайн работает нормально, за исключением последнего запроса. Кассандра не позволяет запрашивать статус, если я не исправлю идентификатор продукта. Я думаю, что определение семейства суперколонок с ключом «PRIMARY KEY ((prodgroup), staus, productid)» должно работать. Хотел бы получить совет специалиста по другим альтернативам.


person Nageswara Rao    schedule 21.12.2014    source источник


Ответы (1)


Если вы предоставляете ключ раздела (в данном случае идентификатор группы), то это идеальный вариант использования вторичного индекса. Создайте вторичный индекс статуса, и вы сможете запрашивать точное равенство статуса. Убедитесь, что вы предоставили ключ раздела, потому что, если вы этого не сделаете, запрос пойдет на каждый узел в вашем кластере и, скорее всего, будет тайм-аут. Если вы предоставляете ключ раздела (что вы, кажется, делаете), то вторичный индекс статуса должен позволить вам выполнить ваш запрос.

Есть еще одна проблема ... у вас статус в составе pk. Это означает, что вы НЕ МОЖЕТЕ обновить его для продукта. Вы можете создавать новые строки только для разных статусов. Скорее всего, это не то, что вам нужно. И если это так, вам нужно РАЗРЕШИТЬ ФИЛЬТРАЦИЮ для вашего последнего запроса (что не будет большой проблемой, потому что вы уже отфильтровали для раздела).

Для вашего случая использования это схема и запрос, которые я бы использовал. Я считаю, что он охватывает все варианты использования:

create table products2(
    prodgroup text,
    prodid int,
    status int,
    primary key (prodgroup, prodid)
);

create index on products2 (status);

select * from products2 where prodgroup='groupname' and prodid>0 and status=0;

Поскольку обновления вторичного индекса являются атомарными и управляются cassandra, пока вы попадаете в раздел, это будет работать нормально.

Надеюсь, это поможет.

person ashic    schedule 22.12.2014