首页 > 解决方案 > 如何在 ScalarDB 上实现应用程序级分页

问题描述

这个问题部分是 Cassandra,部分是 ScalarDB。我正在使用 ScalarDB,它在Cassandra. 图书馆似乎运作良好!不幸的是,ScalarDB 不支持分页,所以我必须在应用程序中实现它。

考虑这种情况,其中P主键C是集群键并且E是分区内的其他数据

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

假设我想获取条目E3E4来自P,C2. 对于较小的值,我可以将开始和结束聚类键指定为 C2 并将 fetch limit 设置为 4 并忽略E1and E2。但是如果有数百条记录,那么这种方法将无法扩展。

例如说P,C1有 10 条记录,P,C2有 100 条记录,我想为每个查询实现 20 条记录的分页。然后要实现这一点,我必须查询 1 - 扫描 - 主键将是 P,集群开始将是 C1,集群结束将是 Cn,因为我不知道那里有多少条记录。

我还必须维护查询的最后一个集群键是C2,并且从中获取了 10 条记录。

查询 2(用于下一个分页请求) - 扫描 - 主键为 P,聚类开始为 C2,聚类结束为 Cn,因为我不知道那里有多少条记录。现在我将获取P,C2并获取 20 个,忽略第一个 10(因为它们上次发送),获取剩余的 10 个,使用相同的 Scan 进行另一次获取并从中获取前 10 个。

这是应该怎么做还是有更好的方法?我对上述实现的担忧是,每次我都必须获取大量记录并转储它们。例如,假设我想从那里获取记录 70-90,P,C2我仍然会查询到记录 60 并转储结果!

标签: scalardb

解决方案


主键和集群键组成一个主键,因此您上面的示例看起来不正确。让我们假设以下数据结构。

P, C1, ...
P, C2, ...
P, C3, ...
...

无论如何,我认为其中一种方法可能如下。假设页面大小为 2。

  1. 以起始 (P, C1) 包括在内、升序和限制 2 进行扫描。结果存储在 R1 中
  2. 获取 R1 -> (P, C2) 的最后一条记录。
  3. 以不包括上一条记录 (P, C2) 开始扫描,以限制 2 递增。 ...

推荐阅读