Cassandra分页和令牌功能;选择分区键

问题描述 投票:0回答:1

我最近在Cassandra数据建模和最佳实践方面做了很多阅读。

如果我希望应用程序通过令牌功能翻译结果,那么选择分区键的最佳做法是逃避我的是什么。

我目前的问题是我想在我的应用程序中每页显示100个结果,然后能够继续下一个100。

从这篇文章:https://stackoverflow.com/a/24953331/1224608我的印象是应该选择一个分区键,使数据在每个节点上均匀分布。也就是说,分区密钥不一定需要是唯一的。

但是,如果我使用令牌功能来翻阅结果,例如:

SELECT * FROM table WHERE token(partitionKey) > token('someKey') LIMIT 100;

这意味着从我的分区返回的结果数可能不一定与我在页面上显示的结果数相匹配,因为多行可能具有相同的标记(partitionKey)值。或者更糟糕的是,如果共享分区键的行数超过100,我将错过结果。

我可以在每个页面上保证100个结果的唯一方法(除了最后一页)是我要使分区键唯一。然后,我可以读取页面中的最后一个值,并使用几乎相同的查询检索下一个查询:

SELECT * FROM table WHERE token(partitionKey) > token('lastKeyOfCurrentPage') LIMIT 100;

但我不确定是否为复杂表格提供唯一的分区键是一种好习惯。

任何帮助是极大的赞赏!

cassandra cql cassandra-3.0 cqlsh
1个回答
2
投票

但我不确定是否为复杂表格提供唯一的分区键是一种好习惯。

这取决于要求和数据模型应如何选择分区键。如果您有一个密钥作为分区密钥,则它必须是唯一的,否则数据将被upsert(用新数据覆盖)。如果您有宽行(聚类键),那么使您的分区键唯一(在表中出现一次的键)将不会用于宽行。在CQL中,“宽行”只意味着每个分区可以有多个行。但是这里每个分区会有一行。如果你能提供架构会更好。

请按照以下链接了解Cassandra的分页。

如果您使用的是Cassandra 2.0+,则无需使用令牌。 Cassandra 2.0具有自动分页功能。它不是使用令牌功能来创建分页,而是现在的内置功能。

Results pagination in Cassandra (CQL)

https://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0 https://docs.datastax.com/en/developer/java-driver/2.1/manual/paging/

保存并重用分页状态

您可以使用pagingState对象来表示在获取最后一页时您在结果集中的位置。

编辑:

请检查以下链接:

Paging Resultsets in Cassandra with compound primary keys - Missing out on rows

© www.soinside.com 2019 - 2024. All rights reserved.