Hi/Lo 알고리즘
Hi/Lo algorithmHi/Lo는 데이터베이스에서 기본 키로 사용할 고유한 키를 생성하는 데 사용되는 알고리즘입니다.시퀀스 기반의 hi-lo 패턴을 사용하여 값을 생성합니다.DDD(Domain-Driven Design)와 함께 사용할 수 있습니다. Hi/Lo는 애플리케이션이 지속하기 전에 엔티티가 있어야 하는 시나리오에서 사용됩니다.가치 창출 전략입니다.Hi/Lo 대신 키를 UUID(Universal Unique Identifier)로 생성하는 방법이 있습니다.
설명.
전제 조건은 다음과 같습니다.
- 최대 낮은 값을 유지하도록 정의된 상수가 있습니다.값은 0보다 커야 합니다.적절한 값은 1000 또는 32767입니다.
- 현재 할당된 높은 값을 유지하도록 정의된 변수가 있으며 이 변수에는 값 0이 할당됩니다.
- 현재 할당된 낮은 값을 유지하도록 정의된 변수가 있으며, 이 변수는 최대 낮은 값에 1을 더한 값을 할당합니다.
순서는 다음과 같습니다.
- 현재 할당된 낮은 값이 최대 낮은 값보다 크거나 같으면 함수를 호출하여 새로운 높은 값을 가져오고 현재 할당된 낮은 값을 0으로 리셋합니다.
- 현재 할당되어 있는 상한값에 최대 하한값을 곱하고 현재 할당되어 있는 하한값을 추가하여 키를 할당합니다.
- 현재 할당되어 있는 낮은 값을 1씩 늘립니다.
알고리즘.
그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.
「 」를 참조해 주세요.
레퍼런스
- ^ Sperko, Richard. Java persistence for relational databases. Apress. p. 236. ISBN 9781590590713.
- ^ Tate, Bruce; Gehtland, Justin. Better, faster, lighter Java (1st ed.). O'Reilly. p. 137. ISBN 0-596-00676-4.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ "SqlServerPropertyBuilderExtensions.UseHiLo Method (Microsoft.EntityFrameworkCore)". docs.microsoft.com.
- ^ "NHibernate Object Relational Mapper". GitHub. NHibernate. 14 November 2019. Retrieved 14 November 2019.
- ^ "NHibernate Object Relational Mapper". GitHub. NHibernate. 14 November 2019. Retrieved 14 November 2019.
- ^ "Doctrine\ORM\Sequencing\TableGenerator API". www.doctrine-project.org.
- ^ "Doctrine Object Relational Mapper (ORM)". GitHub. Doctrine. 14 November 2019. Retrieved 14 November 2019.
- ^ "Marten - Sequential Identifiers with Hilo". jasperfx.github.io.
- ^ "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.
- ^ "HiLo Algorithm RavenDB 5.1 Documentation". ravendb.net.