Как реализовать разбиение на страницы при использовании amazon Dynamo DB в рельсах - PullRequest
13 голосов
/ 01 февраля 2012

Я хочу использовать amazon Dynamo DB с рельсами. Но я не нашел способа реализовать нумерацию страниц.

Я буду использовать AWS::Record::HashModel в качестве ORM.

Этот ORM поддерживает ограничения следующим образом:

People.limit(10).each {|person| ... } 

Но я не мог понять, как реализовать следующий запрос MySql в БД Dynamo.

SELECT * 
  FROM  `People` 
 LIMIT 1 , 30

Ответы [ 3 ]

28 голосов
/ 02 февраля 2012

Вы отправляете запросы, используя LIMIT.Если возвращенное подмножество не содержит полную таблицу, возвращается значение «LastEvaluatedKey».Вы используете это значение как ExclusiveStartKey в следующем запросе.И так далее ...

Из Руководства разработчика по DynamoDB .

1 голос
/ 27 сентября 2017

Вы можете указать «размер страницы» в своем запросе, чтобы установить размер набора результатов. Ответ DynamoDB содержит «LastEvaluatedKey», который будет указывать последний ключ в соответствии с размером страницы. Если ответ не содержит «LastEvaluatedKey», это означает, что не осталось результатов для извлечения. Используйте 'LastEvaluatedKey' как 'ExclusiveStartKey' при получении в следующий раз.

Надеюсь, это поможет.

DynamoDB Нумерация страниц

0 голосов
/ 03 апреля 2019

Я столкнулся с подобной проблемой.

Общий подход к разбиению на страницы заключается в использовании «начального индекса» или «начальной страницы» и «длины страницы».

Подход, основанный на "ExclusiveStartKey" и "LastEvaluatedKey", очень специфичен для DynamoDB.

Мне кажется, что эта специфическая реализация DynamoDB для нумерации страниц должна быть скрыта от клиентского / пользовательского интерфейса API.

Кроме того, в случае, если приложение является безсерверным, с использованием сервиса, такого как Lambda, будет невозможно поддерживать состояние на сервере. Другая сторона - реализация клиента станет очень сложной.

Я пришел с другим подходом, который, я думаю, является общим (и не специфичным для DynamoDB)

Когда клиент API указывает начальный индекс, извлеките все ключи из таблицу и сохранить его в массив.

Узнайте ключ для начального индекса из массива, который указано клиентом.

Используйте ExclusiveStartKey и извлеките количество записей, как указано в длине страницы.

Если параметр индекса запуска отсутствует, вышеуказанные шаги не выполняются необходимо, нам не нужно указывать ExclusiveStartKey в проверке работа.

У этого решения есть некоторые недостатки -

Нам нужно будет извлечь все ключи, когда пользователю нужно разбить на страницы Начальный индекс.

Нам понадобится дополнительная память для хранения идентификаторов и индексов. Дополнительные операции сканирования базы данных (одна или несколько для извлечения ключи)

Но я чувствую, что это будет очень легкий подход для клиентов, которые используют наши API. Обратное сканирование будет работать без проблем. Если пользователь хочет видеть «n-ую» страницу, это будет возможно.

...