Hi/Lo 알고리즘

Hi/Lo algorithm

Hi/Lo데이터베이스에서 기본 키로 사용할 고유한 키를 생성하는 데 사용되는 알고리즘입니다.시퀀스 기반의 hi-lo 패턴을 사용하여 값을 생성합니다.DDD(Domain-Driven Design)와 함께 사용할 수 있습니다. Hi/Lo는 애플리케이션이 지속하기 전에 엔티티가 있어야 하는 시나리오에서 사용됩니다.가치 창출 전략입니다.Hi/Lo 대신 키를 UUID(Universal Unique Identifier)로 생성하는 방법이 있습니다.

설명.

전제 조건은 다음과 같습니다.

  • 최대 낮은 값을 유지하도록 정의된 상수가 있습니다.값은 0보다 커야 합니다.적절한 값은 1000 또는 32767입니다.
  • 현재 할당된 높은 값을 유지하도록 정의된 변수가 있으며 이 변수에는 값 0이 할당됩니다.
  • 현재 할당된 낮은 값을 유지하도록 정의된 변수가 있으며, 이 변수는 최대 낮은 값에 1을 더한 값을 할당합니다.

순서는 다음과 같습니다.

  1. 현재 할당된 낮은 이 최대 낮은 값보다 크거나 같으면 함수를 호출하여 새로운 높은 값을 가져오고 현재 할당된 낮은 값을 0으로 리셋합니다.
  2. 현재 할당되어 있는 상한값에 최대 하한값을 곱하고 현재 할당되어 있는 하한값을 추가하여 키를 할당합니다.
  3. 현재 할당되어 있는 낮은 을 1씩 늘립니다.

A sequence diagram of the Hi/Lo algorithm.

알고리즘.

current_lo(표준) 및current_hi(임의) 변수는 내부 상태 변수입니다.내부 상태는 호출 후에도 유지됩니다.max_lo(임의) constant는 설정 옵션입니다. get_next_hi는 데이터베이스 서버에서 새로운 높은 값을 가져오는 함수입니다.릴레이셔널 데이터베이스 관리 시스템에서는 스토어드 프로시저를 통해 이루어질 수 있습니다.

전제 조건:max_lo0보다 큰 값으로 설정해야 합니다.

알고리즘 generate_key 출력됩니다.current_lo _ max_lo이면 current_hi : = get_next_hi() current_lo : = 0 key : = current_hi × max_lo + current_lo : = current_lo : = current_lose_lo + 1 리턴 입니다.

Python에서의 구현 예.

학급 HiloKeyGenerator:     「Hi/Lo 알고리즘을 사용하는 키 제너레이터.  Args: get_next_hi: 새로운 높은 값을 가져오는 호출 가능한 함수입니다. max_lo:최대 하한값입니다.기본값은 1000 입니다.  인상: ValueError: max_lo 값이 0보다 크지 않은 경우. """      방어하다 __init__(자신, get_next_hi: 콜 가능[[], 인트], max_lo: 인트 = 1000) -> 없음.:         한다면 max_lo <=> 0:             올리다 값 오류("max_lo는 0보다 커야 합니다.")         자신._current_hi = 0         자신._current_lo = max_lo + 1         자신._get_next_hi = get_next_hi         자신._max_lo = max_lo      방어하다 generate_key(자신) -> 인트:         "새로운 고유 키를 생성합니다."""         한다면 자신._current_lo >= 자신._max_lo:             자신._current_hi = 자신._get_next_hi()             자신._current_lo = 0          열쇠 = 자신._current_hi * 자신._max_lo + 자신._current_lo         자신._current_lo += 1          돌아가다 열쇠 

출력:

>>>방어하다 get_next_hi(): ...    돌아가다 2  # 데이터베이스 서버에서 ... >>>발전기 = HiloKeyGenerator(get_next_hi) >>>발전기.generate_key() 2000 >>>발전기.generate_key() 2001 >>>발전기.generate_key() 2002 

책들

Richard Sperko의 2003년판 Java Persistence for Relational Databases (236페이지)[1]에서 간략하게 언급되었습니다.

Bruce Tate와 Justin Gehtland의 2004년 책 [2]Better, Faster, Light Java (137페이지)에서 매우 짧게 언급되었습니다.

Brian Sam-Bodden과 Christopher M Jud의 2004년도 예산에 관한 Enterprise Java Development: Leveraging Java Open Source(386페이지)[3]에서 간략히 언급되었습니다.

Suhas Chatekar의 2015년 책 Learning NHibernate 4 (53페이지 및 144-145페이지)[4]에서 설명합니다.

2017년판 NHibernate 4.x 요리책 [5]35페이지에 언급되어 있습니다.

2018년 ASP에 언급되어 있다.NET Core 2 Fundamentics (219페이지)[6]

이 구현에서는 hi/lo 알고리즘을 사용하여 식별자를 생성합니다.알고리즘은 데이터베이스에서 검색된 높은 값을 사용하여 낮은 값의 범위와 결합하여 고유한 식별자를 생성합니다.높은 값은 열의 값입니다.next_id테이블의hibernate_unique_key디폴트입니다.그러나 다른 테이블을 사용하도록 재정의할 수 있습니다.또한 이 알고리즘은 다음 명령어를 지정할 수도 있습니다.where다른 엔티티의 높은 값을 취득하기 위해 사용할 수 있는 파라미터입니다.hibernate_unique_key테이블.

--

Hilo는 작업할 두 개의 숫자 세트가 필요합니다.하나는hi데이터베이스 테이블에서 발신되며, 그 외는loNHibernate에 의해 계산됩니다.NHibernate는 공식을 사용하여 이 두 숫자를 결합하여 식별자로 사용할 수 있는 고유한 번호를 생성합니다.

--

자동 증분 ID가 더 간단하지만 컨텍스트에 엔티티를 추가할 때마다 엔티티를 데이터베이스에 강제로 삽입합니다.이는 자동증분 ID의 경우 실제 삽입이 발생한 경우에만 ID를 취득할 수 있기 때문입니다.HiLo 알고리즘은 데이터베이스 시퀀스를 사용하여 ID를 미리 예약함으로써 이러한 제약에서 해방됩니다.

--

지지하다

Entity Framework Core(ORM for)에서 지원됩니다.NET Core)와 Microsoft SQL Server를 사용하여UseHiLo확장 [7]방식이전 엔티티 프레임워크에서는 지원되지 않습니다.

하이버네이트(Java의 경우 ORM) 및 NHibernate(의 경우 ORM)에서 지원됩니다.NET) ~SequenceHiLoGenerator[8] 그리고TableHiLoGenerator적어도 2002년부터 지원을 받고 있다.[9]버전 3.2 이상부터 Gavin King에 의해 작성된 코드 지원

를 통해 독트린(PHP의 경우 ORM)에 의해[10] 지원됩니다.TableGenerator클래스[11]

Marten(용 영속 라이브러리)에서[12] 지원됩니다.NET) (Postgre 포함)SQL을 통해HiLoSequence클래스[13]

RavenDB(NoSQL 문서 데이터베이스)에서[14] 지원됩니다.

Apache Cayenne, ServiceStack에서는 지원되지 않습니다.OrmLite, Ruby on Rails Active Record, Dapper 및 Dashing.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Sperko, Richard. Java persistence for relational databases. Apress. p. 236. ISBN 9781590590713.
  2. ^ Tate, Bruce; Gehtland, Justin. Better, faster, lighter Java (1st ed.). O'Reilly. p. 137. ISBN 0-596-00676-4.
  3. ^ Sam-Bodden, Brian; M Jud, Christopher. Enterprise Java development on a budget : leveraging Java open source technologies. Apress. p. 386. ISBN 978-1-59059-125-3.
  4. ^ Chatekar, Suhas (2015-07-31). Learning NHibernate 4 : explore the full potential of NHibernate to build robust data access code. Packt Publishing Ltd. p. 53. ISBN 9781784392062.
  5. ^ Liljas, Gunnar; Zaytsev, Alexander; Dentler, Jason (2017-01-31). NHibernate 4.x cookbook : over 90 incredible and powerful recipes to help you efficiently use NHibernate in your application (Second ed.). Packt Publishing Ltd. p. 35. ISBN 9781784394110.
  6. ^ Gumus, Onur; T. S. Ragupathi, Mugilan (2018-08-30). ASP.NET Core 2 fundamentals : build cross-platform apps and dynamic web services with this server-side web application framework. Packt Publishing Ltd. p. 219. ISBN 9781789533552.
  7. ^ "SqlServerPropertyBuilderExtensions.UseHiLo Method (Microsoft.EntityFrameworkCore)". docs.microsoft.com.
  8. ^ "NHibernate Object Relational Mapper". GitHub. NHibernate. 14 November 2019. Retrieved 14 November 2019.
  9. ^ "NHibernate Object Relational Mapper". GitHub. NHibernate. 14 November 2019. Retrieved 14 November 2019.
  10. ^ "Doctrine\ORM\Sequencing\TableGenerator API". www.doctrine-project.org.
  11. ^ "Doctrine Object Relational Mapper (ORM)". GitHub. Doctrine. 14 November 2019. Retrieved 14 November 2019.
  12. ^ "Marten - Sequential Identifiers with Hilo". jasperfx.github.io.
  13. ^ "Postgresql as a Document Database and Event Store for .Net Applications: JasperFx/marten". GitHub. The Jasper Framework and Related Projects. 14 November 2019. Retrieved 14 November 2019.
  14. ^ "HiLo Algorithm RavenDB 5.1 Documentation". ravendb.net.

외부 링크