这个问题是部分-卡桑德拉和部分ScalarDB。我使用的是ScalarDB,它在Cassandra之上提供了ACID支持。图书馆似乎运转得很好!不幸的是,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
假设我想从E3获得条目E4和P,C2。对于较小的值,我可以将开始和结束集群键指定为C2,并将获取限制设置为4,忽略E1和E2。但是,如果有几百条记录,那么这种方法就不会有规模。
例如,假设P,C1有10条记录,P,C2有100条记录,我想实现每次查询20条记录的分页。为了实现这一点,我将不得不查询1扫描-主键将是P,集群开始将是C1,集群结束将是Cn,因为我不知道有多少记录。
P,C1。这将给出10张唱片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并转储结果!
发布于 2020-07-31 11:58:26
主键和聚类键构成主键,因此上面的示例看起来不正确。让我们假设以下数据结构。
P, C1, ...
P, C2, ...
P, C3, ...
...不管怎样,我认为其中一种方法可以如下所示。假设页面大小为2。
.
https://stackoverflow.com/questions/63178158
复制相似问题