Java 从cassandra数据库检索所有行的有效方法
我有一张卡桑德拉表格,定义如下Java 从cassandra数据库检索所有行的有效方法,java,cassandra,cassandra-3.0,datastax-java-driver,Java,Cassandra,Cassandra 3.0,Datastax Java Driver,我有一张卡桑德拉表格,定义如下 CREATE TABLE IF NOT EXISTS PRODUCT_INV ( Product_Code TEXT, Storecode TEXT, StoreType TEXT, ProductInfo TEXT, PRIMARY KEY ((Product_Code, Storecode, StoreType))); 现在,我想获得所有产品代码的列表,这些代码特定于Storecode和StoreType。 做同样的事情最有效的方法是什么。该表可以包含大量记
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 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
卡桑德拉数据建模是关于非规范化的。如果有疑问,反规范化通常是最有效的方法 在这种情况下,如果创建下表:
CREATE TABLE IF NOT EXISTS product_codes_by_store (
product_code TEXT,
storecode TEXT,
store_type TEXT
PRIMARY KEY ((storecode, store_type), product_code));
现在,您可以进行此查询以获取所有产品代码:
按存储区从产品代码中选择*,其中存储区代码='aaa'和存储区类型='bbb'代码>
这种方法非常有效,因为Cassandra只需要点击单个分区(因此是单个节点)即可完成查询
但是,您需要记住以下几点:
如果有大量结果,您可能需要分页,以便查询不会超时。以下是Java驱动程序的文档,介绍了如何执行此操作:
因为我在这里添加了一个集群列(product\u code
),所以您需要确保由(storecode,store\u type)
定义的分区不会太大。建议尽可能将分区保持在100MB以下,因为非常大的分区可能会导致性能问题。不过这里有一点回旋余地——如果超过100MB,也不算太糟糕,尤其是在较新版本的Cassandra上,它更好地支持大分区(请参阅)