Oi/lo algoritmo

Content

Explicação

As pré -condições são:

There is a constant defined to hold the maximum low value. The value must be greater than zero. A suitable value could be 1000 or 32767.There is a variable defined to hold the currently assigned high value and it is assigned the value 0 (zero).There is a variable defined to hold the currently assigned low value and it is assigned the value of the maximum low value plus 1 (one).

As etapas são:

If the currently assigned low value is greater or equal than the maximum low value then call a function to fetch a new high value and reset the currently assigned low value to 0 (zero).Assign a key by multiplying the currently assigned high value with the maximum low value and adding the currently assigned low value.Increment the currently assigned low value by 1 (one).

Algoritmo

As variáveis ​​Current_LO (Integer) e Current_Hi (número inteiro) são variáveis ​​de estado internas. O estado interno é retido através de invocações. A constante max_lo (número inteiro) é uma opção de configuração. get_next_hi é uma função que recupera um novo valor alto de um servidor de banco de dados. Em um sistema de gerenciamento de banco de dados relacional, isso pode ser através de um procedimento armazenado.

Pré -condição: max_lo deve ser definido como um valor maior que zero.

algorithm generate_key is output: key as a positive integer if current_lo ≥ max_lo then current_hi := get_next_hi() current_lo := 0 key := current_hi × max_lo + current_lo current_lo := current_lo + 1 return key

Exemplo

Exemplo de implementação em Python.

Classe HilokeyGenerator: "" "Gerador de chave que usa um algoritmo HI/LO. Args: get_next_hi: uma função chamada que recupera um novo valor alto. max_lo: o valor baixo máximo. Padrão para 1000. aumenta: valueerror: se o valor de max_lo não é maior que zero. "" "def __init __ (self, get_next_hi: chamável [[], int], max_lo: int = 1000) -> Nenhum: se max_lo <= 0: Raise ValueError (" max_lo deve ser maior que zero . ") self._current_hi = 0 self._current_lo = max_lo + 1 self._get_next_hi = get_next_hi self._max_lo = max_lo def generate_key (self) -> int:" "" gerar uma nova chave. "" "Se self._curnt_lo > = self._max_lo: self._current_hi = self._get_next_hi () self._current_lo = 0 key = self._current_hi * self._max_lo + eu

Resultado:

>>> def get_next_hi (): ... retorna 2 # do servidor de banco de dados .... >>> gerador = hilokeygenerator (get_next_hi) >>> generator.gereate_key () 2000 >>> gerador.gerester_key () 2001 >> > generator.generate_key () 2002

Livros

Muito brevemente mencionado no livro de 2003, Java Persistence para bancos de dados relacionais de Richard Sperko na página 236.

Muito brevemente mencionado no livro de 2004, melhor, mais rápido e mais leve Java de Bruce Tate e Justin Gehtland na página 137.

Muito brevemente mencionado no Livro de 2004 Enterprise Java Development com orçamento: Aproveitando Java Open Source de Brian Sam-Bodden e Christopher M Jud na página 386.

Explicado no livro de 2015 Learning Nibernate 4 por Suhas Chatekar na página 53 e 144-145.

Mencionado no livro de 2017 Nibernate 4.x Book Book na página 35.

Mencionado no livro de 2018 ASP.NET Core 2 Fundamentals na página 219.

Esta implementação usa o algoritmo HI/LO para gerar identificadores. O algoritmo usa um alto valor recuperado do banco de dados e o combina com a faixa de valores baixos para gerar um identificador exclusivo. O valor alto é da coluna Next_Id da tabela hibernate_unique_key por padrão. Mas você pode substituir isso para usar uma tabela diferente. Esse algoritmo também suporta especificar um parâmetro onde pode ser usado para recuperar o alto valor para diferentes entidades de diferentes linhas da tabela Hibernate_unique_key.

-Suhas Chatekar, Aprendendo Nibernato 4 (2015-07-31)

Hilo precisa de um conjunto de dois números para trabalhar. Um é o HI, que é proveniente de uma tabela de banco de dados e outro é calculado pelo Nibernate. O Nibernate combina esses dois números usando uma fórmula para gerar um número exclusivo que pode ser usado como identificador.

-Suhas Chatekar, Aprendendo Nibernato 4 (2015-07-31)

Embora os IDs incrementados automaticamente sejam mais simples, sempre que você adiciona uma entidade ao contexto, essa adição força a entidade a ser inserida no banco de dados. Isso ocorre porque só podemos recuperar o ID se a inserção real acontecer no caso de IDs incrementados automaticamente. O algoritmo Hilo nos liberta dessa restrição, reservando os IDs de antemão usando uma sequência de banco de dados.

-Onur Gumus e Mugilan T. S. Ragupathi, ASP.NET Core 2 Fundamentals (2018-08-30)

Apoiar

Suportado pelo Entity Framework Core (ORM para .NET Core) com o Microsoft SQL Server usando o método de extensão UseHilo. Não suportado pela estrutura da entidade antecessora.

Suportado pelo hibernato (ORM para Java) e Nibernate (ORM para .NET) através do sequenceHilogerator e TableHilogerator. Teve apoio desde pelo menos 2002. Tinha apoio desde pelo menos a versão 3.2 com o código de autoria de Gavin King.

Suportado pela Doutrina (ORM para PHP) através da classe TableGenerator.

Apoiado pela Marten (Biblioteca de Persistence para .NET) com o PostgreSQL através da classe Hilosequence.

Suportado pelo RavendB (um banco de dados de documentos NoSQL).

Não suportado por Apache Cayenne, ServiceStack.ormlite, Ruby on Rails Active Record, Dapper e Dashing.

Veja também

Distributed transactionDomain-driven design (DDD)Primary key