2010-04-14 2 views
1

Pour diverses raisons, j'ai besoin d'un identifiant entier unique pour mes entités stockées dans Google App Engine. Le type de clé généré automatiquement a ce comportement, mais il ne part pas de 1 (ou 0) et ne garantit pas que la partie entière générée proviendra d'une séquence continue.Quelle est la meilleure façon de créer un ID entier en cours d'exécution sur le stockage de données AppEngine?

Quelle serait la meilleure façon de l'implémenter efficacement sur AppEngine? Y a-t-il un support du système de stockage? Pour ajouter à la complexité, je pourrais avoir besoin de faire cela sur des entités de différents groupes d'entités, ce qui signifie que je ne peux pas obtenir l'ID le plus élevé maintenant et enregistrer une entité avec l'ID suivant dans une transaction. Memcache pourrait être le chemin à parcourir ..?

Edit:

Je vous êtes pas encore mis en œuvre, mais de clarifier l'idée memcache. Je sais que memcache n'est pas fiable, mais en pratique, il ne perdra probablement pas de données «trop souvent» pour nuire aux performances. Fondamentalement, je voudrais avoir une entrée memcache pour le dernier id utilisé, mettre à jour (en quelque sorte atomiquement) chaque fois que je crée une nouvelle entité et utiliser cet ID. Dans le cas de memcache n'ayant pas de valeur pour cette entrée, j'obtiendrais l'identifiant le plus élevé jusqu'ici en faisant une requête sur mes entités triées par l'identifiant et mettre à jour memcache (à moins que quelqu'un d'autre ne l'ait déjà fait). Le seul problème que je peux voir avec ceci maintenant serait l'atomicité de l'opération dans son ensemble si la sauvegarde de ma nouvelle entité faisait aussi partie d'une transaction. Pensées..?

+1

Ce ne sera pas facile. Memcache est peu fiable. Pourquoi voulez-vous que cette identification soit auto-incrémentée? Il y a probablement une meilleure solution. –

+0

Je seconde ce que @Jason a dit - dites-nous vos contraintes, et nous proposerons une solution. –

+0

Il pourrait y avoir un meilleur moyen, mais j'ai une raison de vouloir des id entiers qui sont ordonnés par le temps de création de l'entité, et emballés étroitement ensemble, idéalement sans aucun trou du tout. Sans entrer dans beaucoup de détails, je veux effectuer certaines opérations sur des sous-ensembles de données identifiées par une ou plusieurs plages à travers cet ID, où vous pouvez idéalement compter le nombre d'entités auquel un sous-ensemble se réfère uniquement à partir des plages elles-mêmes. – SoftMemes

Répondre

0

Si vous pouviez vivre sans la partie entière, essayez le module UUID (à partir la bibliothèque standard): http://docs.python.org/library/uuid.html

Ce serait généralement vous donner une chaîne de 36 caractères, cependant, Maybee qui est trop loin de ce que vous avez besoin. Mais c'est unique.

+0

Ce n'est pas continu, ou même monotone. –

+0

@Jacob, si tout ce dont vous avez besoin est unique, il est plus facile de laisser le magasin de données remplir l'ID pour vous. Freed demande des numéros continus. –

Questions connexes