首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ScalarDB上实现应用层分页

如何在ScalarDB上实现应用层分页
EN

Stack Overflow用户
提问于 2020-07-30 17:14:37
回答 1查看 50关注 0票数 0

这个问题是部分-卡桑德拉和部分ScalarDB。我使用的是ScalarDB,它在Cassandra之上提供了ACID支持。图书馆似乎运转得很好!不幸的是,ScalarDB不支持分页,所以我必须在应用程序中实现它。

考虑这样的场景:P是主键,C是集群键,E是分区中的其他数据。

代码语言:javascript
复制
Partition => { P,C1,E1
P,C2,E1
P,C2,E2
P,C2,E3
P,C2,E4
P,C3,E1
...
P,Cm,En
}

在ScalarDB中,我可以指定键的开始值和结束值,因此我认为ScalarDB将只从指定的行获取数据。我也可以限制不。获取的条目。

https://scalar-labs.github.io/scalardb/javadoc/com/scalar/db/api/Scan.html

假设我想从E3获得条目E4P,C2。对于较小的值,我可以将开始和结束集群键指定为C2,并将获取限制设置为4,忽略E1E2。但是,如果有几百条记录,那么这种方法就不会有规模。

例如,假设P,C1有10条记录,P,C2有100条记录,我想实现每次查询20条记录的分页。为了实现这一点,我将不得不查询1扫描-主键将是P,集群开始将是C1,集群结束将是Cn,因为我不知道有多少记录。

  • get P,C1。这将给出10张唱片
  • get P,C2。这会给我20张唱片。我将忽略最后的10,将P,C1的10与P,C2的前10合并,并返回结果。

我还必须坚持,最后查询的集群键是C2,并且从其中提取了10条记录。

查询2(对于下一个分页请求)-扫描-主键将是P,集群开始将是C2,集群结束将是Cn,因为我不知道有多少记录。现在我将获取P,C2并得到20,忽略前10 (就像上次发送的那样),取剩下的10,使用相同的扫描进行另一次提取,并从中取出前10。

应该这样做吗?还是有更好的办法?我对上述实现的关注是,每次我必须获取大量记录并将其转储。例如,假设我想从P,C2获得记录70-90,那么我仍然会查询记录60并转储结果!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-31 11:58:26

主键和聚类键构成主键,因此上面的示例看起来不正确。让我们假设以下数据结构。

代码语言:javascript
复制
P, C1, ...
P, C2, ...
P, C3, ...
...

不管怎样,我认为其中一种方法可以如下所示。假设页面大小为2。

  1. 扫描包括起始(P,C1),上升和限制2。存储在R1
  2. 中的结果得到R1 -> (P,C2)的最后一次记录。
  3. 扫描与开始前一次记录(P,C2)不包含,上升到限制2。.

.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63178158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档