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