Уникальный короткий идентификатор для групп объектов в App Engine

Я искал ответы на этот вопрос, но ничего не нашел на деньги. Мне было бы очень интересно услышать мысли людей. Вот оно:

Допустим, в Google AppEngine у ​​меня есть несколько объектов User, каждый из которых может иметь несколько объектов Photo. Объекты User должны быть родителями соответствующих им объектов Photo.

Но я также хочу иметь возможность иметь хорошие короткие URL для каждой фотографии. Я намеревался генерировать их с помощью Base64, кодирующего автоматически сгенерированное свойство идентификатора каждой фотографии, но я понимаю, что не могу этого сделать, поскольку идентификаторы, генерируемые AppEngine, не гарантируют, что они будут уникальными среди групп объектов (т. Е. Для объектов с разными родителями). Таким образом, фотография, являющаяся дочерним элементом одного пользователя, может иметь тот же идентификатор, что и фотография, являющаяся дочерним элементом другого пользователя.

Это оставляет меня в рассоле. Я могу либо:

  1. Попробуйте придумать мой собственный генератор уникальных идентификаторов и используйте его

  2. Потерять иерархию parent-> child, чтобы идентификаторы были уникальными (вообще не заинтересованы в этом)

  3. Какой-то супер-умный вариант, предложенный в качестве ответа на этот вопрос

Я действительно надеюсь на вариант 3.

Любые мысли или идеи о лучшем способе борьбы с этим были бы фантастическими.

Заранее спасибо.

редактировать

Сразу после публикации у меня возникла идея включить в приложение мини-службу сокращения URL-адресов. Мне просто нужна модель без родителя и единственного свойства "Ключ", которое будет указывать на фотографию, на которую я хочу сослаться. Затем я могу Base64 кодировать Id этой сущности, и все готово. Как вы думаете?

2 ответа

Решение

Почему бы просто не кодировать идентификатор родительского пользователя вместе с идентификатором соответствующей фотографии? Вы можете закодировать его как два целых числа - /123/2 или в любом другом формате, который вы пожелаете, например, base64, как вы предлагаете. Если вы позволяете пользователям выбирать какое-то уникальное имя и использовать его в качестве имени ключа для объекта пользователя, это также более полезно с точки зрения пользовательского интерфейса, так как дает такие URL-адреса, как /photos/nick/123

Если вам сойдет с рук идея № 2 - все готово. как тогда вы получили свой ключ - и "служба сокращения URL" представляет собой один сервлет из 3-4 строк, и все готово.

Но!

Я должен заплатить цену - никаких сделок для вас.

Как AppEngine поддерживают транзакции только внутри группы сущностей. это фактически возрождает вашу более позднюю идею "службы сокращения URL", основанную на другой модели с ключом...

Суть в том, что вы не сможете управлять ею в той же транзакции, в которой вы управляете своими "фотографиями пользователя", поэтому вы можете получить неправильные URL-адреса.

Если вам нужна транзакция - создайте URL из родительских ключей. если нет - используйте прямой уникальный ключ без родительской -> дочерней иерархии.

Другие вопросы по тегам