有人知道如何把记录从桌子上拿出来吗?实际上,我想用DynamoDb在php中创建分页组件。
似乎不可能像1,2,3,4,5.。
因为Dyanmodb只是给我们提供了限制条款,通过它我们可以读到特定的no。,我们可以通过LastEvaluatedKey处理下一个n个记录。所以如果我想直接跳到第5页,怎么可能呢?
根据我的理解,我们不能在分页中显示页码。我们可以做的就是读取某些限制的记录,并提供下一个链接来检索下一个n个记录。
分页是任何web应用程序的基本特性,如果迁移到云数据库(如DynamoDb ),我们如何实现?
请提供您的意见和建议。谢谢
发布于 2014-08-29 12:04:42
是的,你是对的,在OFFSET中没有DynamoDB。但是,仅使用Limit和LastEvaluatedKey,我创建了以下函数:
public function scan($table, $filter = [], $select = null, $limit = 2)
{
$page = isset($_GET['page']) ? $_GET['page'] : 0;
$options = [
'TableName' => $table,
'Count' => true,
];
if (!empty($limit)) {
$options['Limit'] = $limit;
}
if (!is_null($select)) {
$options['Select'] = $select;
}
if (!empty($filter)) {
$options['ScanFilter'] = $filter;
}
$results = $results = $this->_client->scan($options);
while ($page > 0 && isset($results['LastEvaluatedKey'])) {
$results = $results = $this->_client->scan($options);
$options['ExclusiveStartKey'] = $results['LastEvaluatedKey'];
$page--;
}
return $results;
}$this->_client是指DynamoDb客户端对象。
基本上,我用LastEvaluatedKey循环所有条目,直到到达需要的页面。
要获取表中的总条目,请调用$this->scan($this->tableName(), [], null, null)['Count']; (即--不需要任何搜索条件,也不需要分页,就像在普通分页函数中一样)。
发布于 2015-08-21 05:55:07
添加到@Justinas的答案中,如果随机访问,迪纳摩将有相当糟糕的分页性能(即。跳转到任意页面)是需要的。但是,如果只执行下一页和上一页,则可以传递LastEvaluatedKey并将扫描所造成的开销降到最低。
正如注释中所述,您应该尽可能多地缓存结果。至少,可以缓存LastEvaluatedKey结果,以便在用户分页查看结果时不需要重新计算每个分页请求。下面是我的一个例子:
假设您有一个具有如下模式的表,其中CommentID是散列键。
CommentID | Author | Comment | ...
-----------+--------+---------+------------
1 | Joe | Foo | ...
2 | Joe | Bar | ...
3 | John | Baz | ...
4 | Joe | FooBar | ...
5 | Jane | BooBaz | ...
6 | Joesie | Blah | ...
7 | Johnny | Blahaha | ...当您开始分页时,假设您每页请求3个注释,您将得到第一个页面结果和LastEvaluatedKey = 3;然后,如果您对第2页发出第二次扫描请求,则使用ExclusiveStartKey=3获得LastEvaluatedKey = 6;要获得第3页,您将使用LastEvaluatedKey = 6进行另一次扫描。诸若此类。
您可以看到,如果没有任何类型的缓存,要获得第3页,您将执行三次扫描(如果您在第3页之前请求第1页和第2页,则会重复其中的两次扫描)。因此,我建议的优化是为每个页面存储相应的键。你最终会得到这样一张地图:
Page | Hash-Key
------+----------
1 | null
2 | 3
3 | 6
.. | ... 当你浏览结果时,这些值就会被填上。现在,当用户想要第3页时,只需进行一次扫描,使用6作为ExclusiveStartKey。
当然,对于每个页面大小,您都需要这样的查找表,并且只有在新行被添加(或删除)之前,表才是准确的。也就是说,如果您有大量请求,那么存储分页缓存所需的额外内存将是非常值得的。剩下的就是为您的分页缓存设置一个合理的过期时间,具体取决于在表中添加(或删除)新数据的频率。
https://stackoverflow.com/questions/23443683
复制相似问题