选项1很有趣,但你必须小心你的指数。有关更多信息,请参阅您的other question(特别是有关同时查询多个二级索引的位)。这可以通过tables purpose built for your index lookups(下面进一步讨论)来缓解。
高度独特的分区密钥的优点是数据将更多地分布在您的集群中。这里的缺点是,当您使用WHERE store_id = 'foo'
执行请求时,需要查询群集中的所有节点,因为分区密钥没有限制。
选项2你一定要小心。如果您的分区密钥只是store_id,那么每个订单将被放置在此分区内。对于每个订单,将存在n列添加到表示订单上每个属性的商店的单行。关于数据位置,给定商店的所有订单都将放置在相同的Cassandra节点上。
在这两种情况下,为什么不按照状态追踪查询表?这将消除您对该字段的二级索引的需求。特别是它的基数相对较小。
CREATE TABLE orders_by_store_id_status (
store_id VARCHAR,
status VARCHAR,
order_id VARCHAR,
... <additional order fields needed to satisfy your query> ...
PRIMARY KEY ((store_id, status), order_id)
);
这将允许您查询具有给定store_id和状态的所有订单。
SELECT * FROM orders_by_store_id_status WHERE store_id = 'foo' AND status = 'open';
读为快,分区键限制了我们对执行查询节点的数量。