2010-09-23 2 views
3

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

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

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

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

Спасибо,

Riley

ответ

5

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

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

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

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

+0

Спасибо, это выглядит хорошо. Я использую Java, а http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html похоже, что у меня будет то, что мне нужно, чтобы очистить ваш ответ. Я обеспокоен тем, что нет никакой гарантии, что автоматически созданные идентификаторы будут короткими (требуется длинный для числовых идентификаторов), но я думаю, что в худшем случае сохранение моего собственного нижнего счетчика для идентификаторов и создание их сами по-прежнему будут способом , путь лучше, чем отправка всего закодированного ключа. Благодаря! –

1

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

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

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

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

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