Node.js 在cassandra中选择compositetype键

Node.js 在cassandra中选择compositetype键,node.js,cassandra,cql,composite-types,Node.js,Cassandra,Cql,Composite Types,因此,我定义了一个列族,它对行键使用复合ID。因此,假设复合键是CompositeType(LongType,LongType)。因此,我已经测试过使用这种类型存储项目,并且效果很好,SELECT在我知道完整键时也能正常工作。但是假设我想要所有的键,第一个元素是0,第二个元素是任何东西。到目前为止,执行此查询的唯一方法如下: 如果我是所有0:*的键,那么我将对key>=0:0和

因此,我定义了一个列族,它对行键使用复合ID。因此,假设复合键是
CompositeType(LongType,LongType)
。因此,我已经测试过使用这种类型存储项目,并且效果很好,
SELECT
在我知道完整键时也能正常工作。但是假设我想要所有的键,第一个元素是0,第二个元素是任何东西。到目前为止,执行此查询的唯一方法如下:

如果我是所有0:*的键,那么我将对
key>=0:0和<1:0
执行CQL查询,只要存在一个保序分区器,该查询就可以工作

我的问题是:

1) 这种奇怪的语法仅仅是因为我使用的是CQL驱动程序(除了thrift之外,NodeJ的唯一选项)


2) 这种类型的查询是否效率低下?实际上,我使用的是复合键而不是超级列,因为CQL不支持这些列。我在代码中处理这个逻辑没有问题,只要这样使用它没有限制

您最好的选择是使用。这将允许您使用下面的组合优化查找,同时仍然允许您使用组合值的各个部分,就像它们是单独的列一样。您当前正在行键中使用复合,CQL3只支持列名()中的复合,但这可能没问题。在许多这样的情况下,将合成从行键移到列名不会对性能或数据分布产生不利影响,但如果行键没有足够的选择性,则可能会产生不利影响


无论如何,你应该看看CQL3。CQL2已弃用。如果我对您的情况有更多了解,我可以告诉您更多关于如何使您的模型适应CQL 3的信息。

您最好的选择是使用。这将允许您使用下面的组合优化查找,同时仍然允许您使用组合值的各个部分,就像它们是单独的列一样。您当前正在行键中使用复合,CQL3只支持列名()中的复合,但这可能没问题。在许多这样的情况下,将合成从行键移到列名不会对性能或数据分布产生不利影响,但如果行键没有足够的选择性,则可能会产生不利影响


无论如何,你应该看看CQL3。CQL2已弃用。如果我对您的情况有更多了解,我可以告诉您更多关于如何使您的模型适应CQL 3的信息。

我建议您更改数据模型。使用RandomPartitioner并将第一个组件作为行键。将第二个组件推入列名中,即改为使列名复合

因为列名总是被排序的,所以可以进行简单的切片操作。比如说,

a) 当您知道这两个组件时,对行键(第一个组件)和组合的第一个组件执行get切片

b) 当您只知道第一个组件时,获取行键的完整行(第一个组件)


当您要求CQL3创建一个包含多个主键的表时,这就是CQL3采用的方法

我建议您更改数据模型。使用RandomPartitioner并将第一个组件作为行键。将第二个组件推入列名中,即改为使列名复合

因为列名总是被排序的,所以可以进行简单的切片操作。比如说,

a) 当您知道这两个组件时,对行键(第一个组件)和组合的第一个组件执行get切片

b) 当您只知道第一个组件时,获取行键的完整行(第一个组件)


当您要求CQL3创建一个包含多个主键的表时,这就是CQL3采用的方法

您是对的,这将在使用列而不是行键作为复合项方面起作用,尽管有任何理由不使用行键吗?我知道排序可能会导致负载不平衡的问题,即使数据是均匀分布的。但是我所有的键都以至少8字节的sha1开始,这应该可以消除这一问题。现在我记得我在这里的推理,所以从你说的我知道我可以将键作为LongType,现在列可以是CompositeType(LongType,UTF8Type). 但是,如果值类型不完全相同,我现在就不能声明它们了吗?比如,如果一列是长值,另一列是utf8值,我现在需要说所有列都是ByTestType,因为我不再有静态列名了吗?然后我就失去了cassandra为我做类型转换的功能,对吗?我在这里遗漏了什么吗?根据我的理解,您将有两个选项,存储为您所说的字节,另一个是使用动态组合来存储值。DC允许您使用具有不同数据类型的单个组件。您是对的,这将在使用列而不是行键作为复合项方面起作用,尽管有任何理由不使用行键吗?我知道排序可能会导致负载不平衡的问题,即使数据是均匀分布的。但是我所有的键都以至少8字节的sha1开始,这应该可以消除这一问题。现在我记得我在这里的推理,所以从你说的我知道我可以将键作为LongType,现在列可以是CompositeType(LongType,UTF8Type). 但是,如果值类型不完全相同,我现在就不能声明它们了吗?比如,如果一列是长值,另一列是utf8值,我现在需要说所有列都是ByTestType,因为我不再有静态列名了吗?然后我就失去了cassandra为我做类型转换的功能,对吗?我在这里遗漏了什么吗?根据我的理解,您将有两个选项,存储为您所说的字节,另一个是使用动态组合来存储值。DC允许您拥有具有不同d的单个组件