2010-12-05 38 views
3

J'ai eu un peu de mal avec le HiLoIdGenerator fourni avec NoRM (http://normproject.org/); Je veux l'utiliser pour générer un identifiant unique que je peux utiliser comme SLUG pour mes articles de blog. Actuellement, j'utilise l'ObjectId pour identifier de manière unique un document dans MongoDB, mais comme c'est GUID-like et ça ne semble pas très bien dans une URL, je préférerais avoir quelque chose comme www.myblog.com/posts/1243 et c'est pourquoi j'ai décidé d'utiliser le HiLoIdGenerator.L'utilisation du HiLoIdGenerator dans NoRM pour MongoDB pour créer un identifiant unique

Je voudrais générer mes HiLo id du côté client et j'ai lu le nouveau générateur HiLo ID blog de stuart harris http://red-badger.com/Blog/post/A-simple-IRepository3cT3e-implementation-for-MongoDB-and-NoRM.aspx que NORM permet également cette situation en allouant une gamme d'entiers à la session du client qui peut être utilisé avec impunité (d'autres clients utiliseront une plage différente) mais quand j'ai ouvert le HiLoIdGenerator il a dit que la classe HiLoIdGenerator qui génère une nouvelle valeur d'identité en utilisant l'algorithme HILO. Une seule instance de cette classe doit être utilisée dans votre projet.

J'ai vraiment trois questions:

1) si j'avais plusieurs instances du HiLoIdGenerator dans ma demande (que j'ai eu un exemple dans ma classe de service qui a appelé GenerateId pour chaque nouveau document) que je pourrais garantir effectivement que tous mes identifiants seraient uniques, étant donné que le code de la classe HiLoIdGenerator indique qu'il ne devrait y avoir qu'une seule instance de cette classe dans une application? 2) le constructeur HiLoIdGenerator prend un argument de capacité, et je voudrais savoir ce qu'il fait, j'ai passé 0 et tous les ID générés étaient les mêmes, je suis ensuite passé dans 1 nouveau HiLoIdGenerator (1) l'ID a commencé à 1 et ont été incrémentés de 1; Je ne comprends pas vraiment ce que cela fait, mais je présume que cela a quelque chose à voir avec un éventail de valeurs potentielles que le générateur peut générer, mais je ne suis pas sûr, et j'aimerais le faire. Quelqu'un pourrait-il expliquer cet argument? 3) Je pense comprendre le but de l'algorithme HiLo comme expliqué ici What's the Hi/Lo algorithm? mais ce que je ne comprends pas, c'est si je peux avoir deux instances de MongoDB avec deux applications différentes regardant chacune une instance différente d'un MongoDB mais les deux contenant les mêmes types de collection, que les ID générés soient globalement uniques, c'est-à-dire que je puisse les utiliser comme GUID, ou sont-ils simplement uniques dans une instance donnée de MongoDB, empêchant ainsi une fusion des deux collections dans une seule instance de MongoDB à une date ultérieure?

grâce

+0

Je pense en ce qui concerne ma deuxième question que la capacité est simplement une gamme de valeurs qui représente un Hi et chaque nombre dans cette gamme pourrait être assigné comme al o avant qu'un nouveau salut ne soit demandé; si je n'attribuais qu'un identifiant unique, est-ce que cela aurait du sens de mettre la capacité à 1? – nickbw

Répondre

1

Voir ici pour savoir comment produire ids de plus en plus de façon monotone: http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22

+0

ce que je voudrais faire est d'utiliser le générateur HiLoIdGenerator afin que je puisse avoir la valeur disponible côté client, avant que le document ne soit sauvegardé dans MongoDB, cette méthode d'insertion si pas présente semble être une fonction qui est exécutée sur le db . acclamations – nickbw

+0

+1 comme je suis en réalité en utilisant des identifiants monotones, mais en utilisant incorrectement le HiLoIdGenerator pour le faire, si vous n'utilisez réellement que HiLoGenerator pour générer des identifiants monotones, cela fonctionnera mais il est trop lourd car vous pouvez avoir un champ dans une collection séparée que vous incrémentez de 1 et que vous l'utilisez, vous n'avez pas besoin de la surcharge de l'algorithme HiLo, il devrait être utilisé si vous attribuez 2 + ID à la fois, avec le potentiel pour plusieurs clients assignant ces ID – nickbw

0
  1. Oui ils seraient uniques, chaque client (HiLoGenerator) demanderait une gamme de son lo qui pourrait être alloué, mais ils ne seraient uniques que s'ils utilisaient tous deux la même capacité

  2. La capacité est le nombre d'ID que le client peut assigner en toute impunité, encore une fois si vous avez une capacité différente Parmi les clients, vous avez le potentiel de créer des valeurs non uniques. Si vous utilisez des ID en augmentation monotone, vous n'attribuez qu'une seule valeur séquentielle, vous n'avez pas besoin de l'algorithme HiLo, vous avez juste besoin d'un seul emplacement contenant une valeur. Vous pouvez incrémenter et affecter à une nouvelle entité, voir la réponse de dm pour une implémentation de cette

  3. Oui, aussi longtemps que les deux clients utilisent la même collection qui contient la valeur Hi, et aussi longtemps que les deux clients utilisent la même Capcity pour générer les lo