Разработка первичного ключа Cassandra для удовлетворения запросов диапазона
Я разработал семейство колонн
текст prodgroup, prodid int, status int,, PRIMARY KEY ((prodgroup), prodid, status)
Модель данных предназначена для обслуживания
- Получить список продуктов из группы продуктов
- получить список продуктов для данного диапазона идентификаторов
- Получить подробную информацию о конкретном продукте
- Обновление статуса продукта активный / неактивный
- Получить список продуктов, которые являются активными или неактивными (выберите * из продукта, где prodgroup='xyz' и prodid > 0 и status = 0)
Дизайн работает отлично, за исключением последнего запроса. Кассандра не позволяет запрашивать статус, пока я не исправлю идентификатор продукта. Я думаю, что определение семейства суперколонок с ключом "PRIMARY KEY((prodgroup), staus, productid)" должно сработать. Хотел бы получить квалифицированную консультацию по другим альтернативам.
1 ответ
Если вы предоставляете ключ раздела (в данном случае идентификатор группы), то это идеальный вариант использования для вторичного индекса. Создайте дополнительную информацию о статусе, и вы сможете запросить точное равенство по статусу. Убедитесь, что вы предоставили ключ раздела, потому что если вы этого не сделаете, запрос будет направлен на каждый узел в вашем кластере, и, скорее всего, истечет время ожидания. Если вы предоставляете ключ раздела (что, по-видимому, вы делаете), то вторичный индекс состояния должен позволить вам выполнить ваш запрос.
Есть еще одна проблема... у вас есть статус как часть ПК. Это означает, что вы не можете обновить его для продукта. Вы можете создавать новые строки только для разных статусов. Это, вероятно, не то, что вам нужно. И если это так, вам нужно РАЗРЕШИТЬ ФИЛЬТР на свой последний запрос (что не будет большим ударом, потому что вы уже отфильтровали раздел).
Для вашего случая использования это схема и запрос, которые я бы использовал. Я считаю, что он охватывает все случаи использования:
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, пока вы работаете с разделом, это будет работать хорошо.
Надеюсь, это поможет.