отображение закодированных ключей на более короткие идентификаторы в appengine - PullRequest
3 голосов
/ 24 сентября 2010

Я хочу отправить уникальные ссылки клиенту, чтобы они могли ссылаться на определенные объекты. Иногда предоставляемые приложением закодированные ключи имеют длину 50 байт, и мне, вероятно, понадобятся только два или три байта (я мог бы надеяться, что потребуется четыре или пять, но это не будет какое-то время!)

Отправка ключей большего размера на самом деле непомерно дорога, поскольку я мог бы отправлять 400 ссылок за раз.

Итак, я хочу сопоставить эти длинные ключи с намного более короткими ключами. Очевидное решение - сохранить отображение в хранилище данных, но затем, когда я отправляю 400 объектов, я делаю 400 дополнительных запросов, верно? Может быть, я уменьшу расходы, также сохраняя копии сопоставлений в memcache. Есть ли способ лучше?

Могу ли я просто набрать номер из незашифрованных ключей, которые appengine создает и использует? Мне нужен только тот идентификатор, который я использую, чтобы быть уникальным для каждого типа сущности, а не для всего приложения.

Спасибо

Райли

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

Ключи хранилища данных содержат дополнительную информацию, которая вам не нужна - например, идентификатор приложения. Так что вам определенно не нужно отправлять целые ключи.

Если эти ссылки относятся к определенному виду в вашем хранилище данных, то вы можете сделать еще лучше и просто отправить имя ключа или числовой идентификатор (в зависимости от того, какие ключи используются). Если последнее имеет место, то вы можете передать каждый ключ всего несколькими байтами (вы можете выбрать целочисленное кодирование переменной или фиксированной длины в зависимости от того, что будет более компактным для вашего конкретного случая [вероятно, до большинство отправляемых вами идентификаторов становятся довольно большими]).

Когда вы получаете эти частичные ключи от пользователя, должно быть легко восстановить полный ключ, который вам нужен для извлечения сущностей из хранилища данных. Если вы используете среду исполнения Python, вы можете использовать db.Key.from_path(kind_name, numeric_id_or_key_name).

Такая схема должна быть и проще, и (намного) быстрее, чем пытаться использовать хранилище данных / memcache для хранения пользовательского отображения.

1 голос
/ 24 сентября 2010

Вам не нужен специальный механизм отображения.Просто используйте имена ключей сущностей для хранения вашего короткого идентификатора:

entity = MyKind(key_name=your_short_id)
entity.put()

Затем вы можете получить эти короткие идентификаторы в одном запросе:

keys = MyKind.all(keys_only=True).filter(...).fetch(400)
short_ids = [key.name() for key in keys]

Наконец, используйте MyKind.get_by_key_name(short_id) для получениясущности из идентификаторов, отправленных вашими пользователями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...