Cassandra建模,我有十亿种数字代码要存储,我应该使用宽行(带集群键的CQL)吗?

Cassandra建模,我有十亿种数字代码要存储,我应该使用宽行(带集群键的CQL)吗?,cassandra,modeling,Cassandra,Modeling,我目前正在做Cassandra建模,我有几十亿种数字代码要存储,比如: create table hnm ( create_batch_id int, // A creation batch can generate up to 1 million code. hnm_code text, // Cardinality: billions product_name text, primary key (hnm_code) ); 与hnm代码相比,cr

我目前正在做Cassandra建模,我有几十亿种数字代码要存储,比如:

create table hnm (
    create_batch_id int, // A creation batch can generate up to 1 million code.
    hnm_code text,       // Cardinality: billions
    product_name text,
    primary key (hnm_code)
);
与hnm代码相比,
create\u batch\u id
的基数相对较小。但是,我想要的是,我应该能够使用单个
hnm_code
列的值来查询该记录(在查询时,
create_batch_id
是未知的)。 我应该像这样使用宽行(带集群键的CQL)吗

create table hnm_with_cluster_key (
    create_batch_id int,
    hnm_code text,
    product_name text,
    primary key (create_batch_id, hnm_code)
);

谢谢!如果您能建议我如何在这个查询中获得良好的性能,以及hnm_代码的均匀分布,那就太好了。

Cassandra与另一个SQL不同,它使用第一个主键作为分区键。在我看来,分区键最好不是唯一的。所以第二种设计更好

我想要的是,我应该能够使用单个hnm_代码列的值来查询该记录

在Cassandra中,您应该设计与查询模式相匹配的模型。所以这个案子说明了一切。第一个在
hnm\u code
上具有分区键的解决方案将实现这一点

查询时,创建批处理id未知

如果要使用主键为
的第二个解决方案(创建批处理id,hnm代码)
,则需要在查询时了解(并提供)
创建批处理id

如果您能建议我如何在这个查询中获得良好的性能,以及hnm_代码的均匀分布,那就太好了

Cassandra行由分区键的散列值分布。因此,密钥的基数越高,集群中的分布就越均匀。此外,Cassandra的设计可以很好地执行分区键查找,因此您的查询应该非常快


此外,对于第二个表定义,我的查询如下所示:
select*from hnm_with_cluster_key,其中hnm_code='1234'允许过滤

当CQL行数达到数十亿时,使用
ALLOW FILTERING
指令将not执行得很好。我强烈建议不要那样做


现在我想我可能只需要这两个表,一个用于通过单个条件选择单个hnm_代码行
hnm_代码=$hnm_代码
,一个用于通过
create_batch_id=$batch_id
,选择hnm_代码的创建批,但考虑到数十亿行增加了一倍,我重新考虑了这种重复

这就是你问题的症结所在。Cassandra根本不支持这种类型的查询灵活性。从单个表设计支持多个查询通常是不可行的。如果需要支持通过
创建批处理id
进行查询,则需要两个表。每个模型都不支持对其他模型执行良好的查询

是的,数据复制/冗余可能会违反我们在学校学到的关于标准化的所有知识。但Cassandra的设计只是不适用于完全规范化的模型。我去年为Cassandra星球写了一篇文章,讨论了其中的一些权衡:


从本质上讲,虽然大规模数据复制不是任何人真正想做的事情,但在设计高性能Cassandra模型时,它可能是一种必要的权衡。

此外,对于第二个表定义,我的查询如下所示:
select*from hnm_with_cluster_key,其中hnm_code='1234'允许过滤现在我想我可能只需要这两个表,一个用于通过单个条件选择单个HNMU代码行
HNMU代码=$hnm\U代码
,一个用于通过
create\u batch\u id=$batch\u id
选择HNMU代码的创建批次,但考虑到数十亿行的数量增加了一倍,我对这种重复表示不满。谢谢,恐怕我不认为分区键应该是低基数的,因为任何分区键都会散列到
标记中
,以确定它属于哪个分区。感谢您提供详细而准确的答案,这真的很有帮助。