Quel est l'algorithme Hi/Lo?
Quel est l'algorithme Hi/Lo?
J'ai trouvé ça dans le NHibernate de la documentation (c'est une méthode pour générer des clés uniques, section 5.1.4.2), mais je n'ai pas trouvé une bonne explication de la façon dont il fonctionne.
Je sais que Nhibernate de poignées, et je n'ai pas besoin de connaître de l'intérieur, mais je suis juste curieux.
Vous devez vous connecter pour publier un commentaire.
L'idée de base est que vous avez deux numéros pour faire une clé primaire - un niveau "élevé" nombre et un "faible" nombre. Un client peut, en gros, incrémenter le "haut" de la séquence, en sachant qu'il peuvent alors générer des clés de l'ensemble de la gamme de "haute valeur" avec la variété de "faible" des valeurs.
Par exemple, supposons que vous avez un niveau "élevé" de la séquence avec une valeur actuelle de 35, et le "faible" nombre dans la plage de 0û1023. Ensuite, le client peut incrémenter la séquence à 36 (pour d'autres clients pour être en mesure de générer des clés alors que c'est à l'aide de 35) et de savoir que les clés 35/0, 35/1, 35/2, 35/3... 35/1023 sont tous disponibles.
Il peut être très utile, en particulier avec les Orm) pour être en mesure de définir les clés primaires sur le côté client, au lieu d'insérer des valeurs sans les clés primaires et ensuite de les chercher en arrière sur le client. À côté de quelque chose d'autre, cela signifie que vous pouvez facilement faire des relations parent/enfant et avoir les clés tout en place avant de vous faire tout inserts, ce qui rend le dosage plus simples.
En plus de Jon réponse:
Il est utilisé pour être en mesure de travailler déconnecté. Un client peut alors demander au serveur pour un hi nombre et de créer des objets à l'augmentation de la lo nombre lui-même. Il n'a pas besoin de contacter le serveur jusqu'à ce que le lo plage est utilisé.
Le hi/lo algorithmes divise les séquences de domaine en “hi” groupes. Un “salut” la valeur est affectée de manière synchrone. Chaque “hi” groupe reçoit un nombre maximum de “lo” entrées, qui peuvent être affectés hors-ligne, sans vous soucier de la simultanée des entrées en double.
Les identificateurs de gamme est donnée par la formule suivante:
et le “lo” valeur sera dans la gamme:
être appliquée à partir de la valeur de début:
Lorsque tous les “lo” les valeurs sont utilisées, une nouvelle “hi” valeur est extraite et le cycle continue
Vous pouvez trouver une explication plus détaillée dans cet article:
Et la présentation visuelle est facile à suivre ainsi:
Tout en hi/lo optimizer est bien pour l'optimisation de l'identificateur de génération, il ne joue pas bien avec les autres systèmes de l'insertion de lignes dans notre base de données, sans rien connaître de notre identificateur de la stratégie.
Hibernate offre la commun-lo optimizer, qui combine une chaîne hi/lo générateur de stratégie avec une interopérabilité séquence mécanisme d'allocation. Cette optimizer est à la fois efficace et interopérable avec d'autres systèmes, d'être un meilleur candidat que le précédent héritage hi/lo identificateur de stratégie.
Lo est une mise en cache de l'allocateur qui divise l'espace en gros morceaux, généralement basés sur une certaine machine taille de mot, plutôt que de façon significative de la taille des plages (par exemple l'obtention de 200 touches à la fois) dont un être humain peut raisonnablement choisir.
Hi-Lo utilisation tend à déchets d'un grand nombre de touches de redémarrage du serveur, et de générer de grandes humain hostile valeurs de clé.
Mieux que le Hi-Lo allocateur, est le "Linéaire Morceau" l'allocateur. Il utilise une table similaire à base de principe, mais alloue de petites, idéalement gros morceaux de taille & génère homme nice-amicale des valeurs.
D'allouer une nouvelle, disons, 200 clés (qui sont alors considéré comme une plage dans le serveur & utilisé comme nécessaire):
Fournir vous pouvez valider cette transaction (l'utilisation de nouvelles tentatives pour gérer le conflit), vous avez alloué 200 clés & peut s'en passer si nécessaire.
Avec un morceau de taille de 20, ce schéma est 10x plus rapide que l'attribution d'un Oracle de la séquence, et est 100% portable parmi toutes les bases de données. Répartition de la performance est équivalente à la hi-lo.
Contrairement à Ambler idée, il considère l'espace comme un contiguë linéaire numberline.
Cela évite l'impulsion pour les clés composites (qui n'ont jamais été vraiment une bonne idée) et évite de gaspiller l'ensemble de la lo-dire lorsque le serveur redémarre. Il génère des "amis", à taille humaine, des valeurs clés.
M. Ambler l'idée, par comparaison, alloue le haut de 16 ou 32 bits, et génère un grand homme hostile valeurs de clé comme la hi-mots de l'incrément.
Comparaison de l'allocation de touches:
Conception-sage, sa solution est fondamentalement plus complexe sur le nombre de ligne (clés composites, grand hi_word produits) que Linear_Chunk tout en réalisant pas d'avantages comparatifs.
La Hi-Lo design se leva tôt OO de la cartographie et de la persistance. Ces jours persistance des frameworks tels que Hibernate offre plus simple et mieux allocateurs en tant que par défaut.
J'ai trouvé l'algorithme Hi/Lo est parfait pour de multiples bases de données avec des scénarios de réplication de base de mon expérience. Imaginer cela. vous disposez d'un serveur à New York (alias 01) et un autre serveur à Los Angeles (alias 02), alors vous avez une PERSONNE de la table...
ainsi, à New York, lorsqu'une personne est créer... vous utilisez toujours 01 que le SALUT de la valeur et de la valeur LO est la prochaine secuential. por exemple.
à Los Angeles, vous utilisez toujours le SALUT 02. par exemple:
Donc, lorsque vous utilisez la réplication de base de données (n'importe quelle marque) toutes les clés primaires et les données de combiner facilement et naturellement, sans vous soucier de dupliquer des clés primaires, collissions, etc.
C'est la meilleure façon d'aller dans ce scénario.