我在cassandra中有一张表,其定义如下
CREATE TABLE IF NOT EXISTS PRODUCT_INV (
Product_Code TEXT,
Storecode TEXT,
StoreType TEXT,
ProductInfo TEXT,
PRIMARY KEY ((Product_Code, Storecode, StoreType)));
现在我想获取特定于Storecode和StoreType的所有Product_Code的列表。 做同样事情的最有效方法是什么。该表可以包含大量记录。
例如:
Product_Code Storecode StoreType ProductInfo
12 601 Retail ABC
12 601 Supermart ABC
13 601 Retail DEF
14 701 Retail QWE
13 601 Supermart ZXC
结果应为:
Storecode: 601
StoreType: Retail
List of Product_Code : 12,13
Storecode: 601
StoreType : Supermart
List of Product_Code : 12,13
Storecode: 701
StoreType: Retail
List of Product_Code:14
答案 0 :(得分:3)
Cassandra数据建模完全是关于非规范化的。如果有疑问,非规范化通常是最有效的方法。
在这种情况下,如果您创建下表:
CREATE TABLE IF NOT EXISTS product_codes_by_store (
product_code TEXT,
storecode TEXT,
store_type TEXT
PRIMARY KEY ((storecode, store_type), product_code));
现在,您可以进行此查询以获取所有产品代码:
SELECT * FROM product_codes_by_store WHERE storecode = 'aaa' AND store_type = 'bbb';
此方法非常有效,因为Cassandra只需要命中一个分区(因此只需一个节点)即可完成查询。
但是,您需要记住以下几点:
product_code
),因此您需要确保(storecode, store_type)
定义的分区不会太大。建议您尽可能将分区保持在100MB以下,因为非常大的分区可能会导致性能问题。虽然这里有一点余地 - 如果你有点超过100MB,那也不算太糟糕,特别是对于较大版本的Cassandra而言,它们可以更好地支持大型分区(见https://issues.apache.org/jira/browse/CASSANDRA-11206)。