Уникальный короткий идентификатор для групп объектов в App Engine
Я искал ответы на этот вопрос, но ничего не нашел на деньги. Мне было бы очень интересно услышать мысли людей. Вот оно:
Допустим, в Google AppEngine у меня есть несколько объектов User, каждый из которых может иметь несколько объектов Photo. Объекты User должны быть родителями соответствующих им объектов Photo.
Но я также хочу иметь возможность иметь хорошие короткие URL для каждой фотографии. Я намеревался генерировать их с помощью Base64, кодирующего автоматически сгенерированное свойство идентификатора каждой фотографии, но я понимаю, что не могу этого сделать, поскольку идентификаторы, генерируемые AppEngine, не гарантируют, что они будут уникальными среди групп объектов (т. Е. Для объектов с разными родителями). Таким образом, фотография, являющаяся дочерним элементом одного пользователя, может иметь тот же идентификатор, что и фотография, являющаяся дочерним элементом другого пользователя.
Это оставляет меня в рассоле. Я могу либо:
Попробуйте придумать мой собственный генератор уникальных идентификаторов и используйте его
Потерять иерархию parent-> child, чтобы идентификаторы были уникальными (вообще не заинтересованы в этом)
Какой-то супер-умный вариант, предложенный в качестве ответа на этот вопрос
Я действительно надеюсь на вариант 3.
Любые мысли или идеи о лучшем способе борьбы с этим были бы фантастическими.
Заранее спасибо.
редактировать
Сразу после публикации у меня возникла идея включить в приложение мини-службу сокращения URL-адресов. Мне просто нужна модель без родителя и единственного свойства "Ключ", которое будет указывать на фотографию, на которую я хочу сослаться. Затем я могу Base64 кодировать Id этой сущности, и все готово. Как вы думаете?
2 ответа
Почему бы просто не кодировать идентификатор родительского пользователя вместе с идентификатором соответствующей фотографии? Вы можете закодировать его как два целых числа - /123/2
или в любом другом формате, который вы пожелаете, например, base64, как вы предлагаете. Если вы позволяете пользователям выбирать какое-то уникальное имя и использовать его в качестве имени ключа для объекта пользователя, это также более полезно с точки зрения пользовательского интерфейса, так как дает такие URL-адреса, как /photos/nick/123
Если вам сойдет с рук идея № 2 - все готово. как тогда вы получили свой ключ - и "служба сокращения URL" представляет собой один сервлет из 3-4 строк, и все готово.
Но!
Я должен заплатить цену - никаких сделок для вас.
Как AppEngine поддерживают транзакции только внутри группы сущностей. это фактически возрождает вашу более позднюю идею "службы сокращения URL", основанную на другой модели с ключом...
Суть в том, что вы не сможете управлять ею в той же транзакции, в которой вы управляете своими "фотографиями пользователя", поэтому вы можете получить неправильные URL-адреса.
Если вам нужна транзакция - создайте URL из родительских ключей. если нет - используйте прямой уникальный ключ без родительской -> дочерней иерархии.