Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 是否可以按用户定义的数据类型列表中的特定列对Cassandra列族进行排序?_List_Sorting_Cassandra_Nosql_Cqlsh - Fatal编程技术网

List 是否可以按用户定义的数据类型列表中的特定列对Cassandra列族进行排序?

List 是否可以按用户定义的数据类型列表中的特定列对Cassandra列族进行排序?,list,sorting,cassandra,nosql,cqlsh,List,Sorting,Cassandra,Nosql,Cqlsh,我很难理解卡桑德拉。我只是无法写下这个问题而不让它看起来很混乱,但当我在下面详述它时,它可能会变得更清晰 假设我创建了以下数据类型: CREATE TYPE transaction ( transaction_id UUID, value float, transaction_date timestamp, PRIMARY KEY (transaction_id, transaction_date) ); PS:我把它当作“类”来使用,但这可能是我的逻辑错误,如

我很难理解卡桑德拉。我只是无法写下这个问题而不让它看起来很混乱,但当我在下面详述它时,它可能会变得更清晰

假设我创建了以下数据类型:

CREATE TYPE transaction (
    transaction_id UUID,
    value float,
    transaction_date timestamp,
    PRIMARY KEY (transaction_id, transaction_date)
);
PS:我把它当作“类”来使用,但这可能是我的逻辑错误,如果不能这样使用,请纠正我

无论如何,我还有一个列族,我在其中创建了此“事务”数据类型的列表:

CREATE TABLE transactions_history_by_date (
    wallet_address UUID,
    user_id UUID,
    transactions list <transaction>,
    PRIMARY KEY (wallet_address, transaction_date))
WITH CLUSTERING ORDER BY (transaction_date DESC);
按日期创建表事务\u历史\u(
钱包地址UUID,
用户id UUID,
交易清单,
主键(钱包地址、交易日期))
通过聚类顺序(事务\日期描述);

所以我想知道的是,上面这个专栏族是否正确。我想获得钱包的所有交易,按交易日期排序(但日期是“交易”数据类型的一列-更复杂的是,在这个列族中有一个交易列表,而不仅仅是一个交易列表)。

不,在Cassandra中,您只能根据聚类列的值进行排序-在这种情况下,您需要将
事务日期
移动到表本身中…

不,在Cassandra中,您只能根据聚类列的值进行排序-在这种情况下,您需要将
事务日期
移动到表本身中…

以扩展Alex的答案,在您的情况下,我认为最好的方法可能是对您的表进行非规范化。您可以创建如下内容,而不是使用UDT:

CREATE TABLE transactions_history_by_date (
wallet_address UUID,
user_id UUID,
transaction_id UUID,
value float,
transaction_date timestamp,
PRIMARY KEY ((wallet_address), transaction_date, transaction_id))
WITH CLUSTERING ORDER BY (transaction_date DESC);
现在您可以进行以下查询,结果将按日期排序:

按日期从交易记录中选择*其中钱包地址=


注意,我添加了
transaction\u id
作为第二个集群键。如果省略此项,该表将无法保存具有相同钱包地址和相同交易日期的两项交易。这是因为唯一的行由主键标识。

要扩展Alex的答案,在您的情况下,我认为最好的方法可能是对表进行非规范化。您可以创建如下内容,而不是使用UDT:

CREATE TABLE transactions_history_by_date (
wallet_address UUID,
user_id UUID,
transaction_id UUID,
value float,
transaction_date timestamp,
PRIMARY KEY ((wallet_address), transaction_date, transaction_id))
WITH CLUSTERING ORDER BY (transaction_date DESC);
现在您可以进行以下查询,结果将按日期排序:

按日期从交易记录中选择*其中钱包地址=


注意,我添加了
transaction\u id
作为第二个集群键。如果省略此项,该表将无法保存具有相同钱包地址和相同交易日期的两项交易。这是因为唯一行由主键标识。

谢谢!顺便说一下,如果我在主键中放置了多个集群键,那么排序将根据我在
中指定的集群键进行,集群顺序为(transaction_date DESC)
,对吗?但是在这种情况下,我没有用于排序的集群列键会有什么用途呢?所有集群列都会进行排序,如果有多个集群列,数据会先在第一列上排序,然后第一列值相同的数据会在第二列上排序,等等。请看这篇文章:谢谢Alex!顺便说一下,如果我在主键中放置了多个集群键,那么排序将根据我在
中指定的集群键进行,集群顺序为(transaction_date DESC)
,对吗?但是在这种情况下,我没有用于排序的集群列键会有什么用途呢?所有集群列都会进行排序,如果有多个集群列,数据会先在第一列上排序,然后第一列值相同的数据会在第二列上排序,等等。请看这篇文章:非常清楚,谢谢Justin!事实上,从我所学到的,卡桑德拉的一个要点是非规范化。我可以再问你几个问题吗?1-如果有多个群集键,我不用于排序的群集键的用途是什么?我的意思是,你说我不能在同一个
钱包地址和
交易日期内进行两次交易。。。我不太清楚原因。另外,2-我如何才能将
交易id
列表链接到
交易日期和
值的列表?我正在考虑使用UDT来实现这种链接,因为每个事务都有特定的时间戳和值,但是如果我对列族进行反规范化并列出这些事务属性,我不确定如何告诉
“transaction\u id 1有时间戳x和值y;事务id 2有时间戳z和值v'
等等…1-我更新了答案,以澄清主键用于标识唯一行(就像SQL数据库一样)。2-如果您想通过
事务\u id
进行查询,则需要使用不同的主键创建第二个表,并复制数据。类似于:
PRIMARY KEY((transaction_id))
可以工作,前提是
transaction_id
在应用程序中是全局唯一的。卡桑德拉也提出了具体化的观点,但是这些观点被认为是实验性的,并且有一些警告,所以要谨慎行事。非常清楚,谢谢贾斯汀!事实上,从我所学到的,卡桑德拉的一个要点是非规范化。我可以再问你几个问题吗?1-如果有多个群集键,我不用于排序的群集键的用途是什么?我的意思是,你说我不能在同一个
钱包地址和
交易日期内进行两次交易。。。我不太清楚原因。另外,2-我如何才能将
交易id
列表链接到
交易日期和
值的列表?我正在考虑使用UDT