как получить n-ую запись запроса хранилища данных - PullRequest
1 голос
/ 06 мая 2009

Предположим, что у меня есть модель Foo в GAE и этот запрос:

query = Foo.all (). Order ('- key ')

Я хочу получить n-ую запись. Какой самый эффективный способ добиться этого?

Будет ли решение сломано, если свойство упорядочения не является уникальным, как показано ниже:

query = Foo.all (). Order ('- color ')

изменить: n> 1000

edit 2: Я хочу разработать дружественный механизм подкачки, который отображает доступные страницы (например, Страница 1, Страница 2, ... Страница 185) и требует "? Page = x" в строке запроса вместо "? закладка = XXX". Когда page = x, запрос должен извлекать записи, начиная с первой записи этой страницы.

Ответы [ 2 ]

3 голосов
/ 06 мая 2009

Нет эффективного способа сделать это - ни в одной СУБД. В любом случае вы должны по крайней мере последовательно читать записи индекса, пока не найдете n-ную, а затем найти соответствующую запись данных. Это более или менее то, что fetch (count, offset) делает в GAE с дополнительным ограничением в 1000 записей.

Лучшим подходом к этому является сохранение «закладки», состоящей из значения поля, в котором вы упорядочиваете последнюю полученную вами сущность, и ее ключа. Затем, когда вы хотите продолжить с того места, на котором остановились, вы можете добавить значение поля в качестве нижней границы запроса неравенства и пропустить записи, пока не совпадете или не превысите последний, который вы видели.

Если вы хотите предоставить «дружественные» смещения страниц пользователям, вы можете использовать memcache для хранения связи между начальным смещением и кортежем закладки (order_property, key). Когда вы создаете страницу, вставьте или обновите закладку для сущности, следующей за последней. При извлечении страницы используйте закладку, если она существует, или сгенерируйте ее сложным способом, выполняя запросы со смещениями - возможно, несколько запросов, если смещение достаточно велико.

2 голосов
/ 06 мая 2009

Документацию для класса Query можно найти по адресу: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

Класс запросов обеспечивает выборку с ограничением и смещением в вашем случае 1 и n

Время выполнения выборки растет линейно со смещением + пределом

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

Вы можете использовать query.filter ('key =', n) query.get ()

, который возвращает первое совпадение с ключом n

...