2010-05-10 5 views
2

C#/NHibnernate 관점에서이 질문을하지만 일반적으로 적용됩니다. 염려되는 점은 HiLo 전략은 id가 꽤 빠르지 만, 예를 들어 낮은 레코드 수 테이블 (예 : 사용자)이 높은 레코드 수 테이블 (예 : 주석)과 동일한 ID 세트에서 공유한다는 것입니다. 따라서 잠재적으로 다른 전략을 사용하면 높은 수를 얻을 수 있습니다. 그렇다면 사람들은 무엇을 추천합니까?HiLo ID 생성 전략을 사용할 때 어떤 유형의 ID를 사용해야합니까?

코드면 : int/uint/long/ulong?

DBSide : int/bigint?

내 느낌은 갈망과 bigingts로 이동하는 것입니다,하지만 전성 검사 :

답변

5

..

각 발전기에 table 매개 변수를 설정할 수 있지만 IMO 그냥 ID를 보유 할 테이블의 불필요한 숫자가 발생합니다.

엔티티 당 하나의 행을 사용하는 것이 좋습니다 (같은 테이블에 있음). 선택적 매개 변수를 사용하면 HiLo 알고리즘을 구성 할 수 있으며 필요한 행만 잠급니다. 당신은 각 개체에 대해 다른 종자를 가지고 있습니다. FluentNH, 그것은 비슷한 것 : 그럼에도 불구

 Id(x => x.Id, "Id") 
      .GeneratedBy.HiLo("IdsTable", "id", "20", 
       p => p.AddParam("where", "table = 'mappedent'")); 

, 당신은 또한 where 추가 PARAM을 피하기 그냥 다른 열 (무엇을 당신도 DB에 쉽게 구분할 ID 유형을 가질 수 있도록)를 설정할 수 있습니다. 하지만 DB 항목의 nr 제한 때문에 많은 수의 엔티티가있는 경우 문제가 발생할 것입니다. 또한 ID 범위를 요청하는 모든 단일 항목이 다른 모든 항목을 잠글 것이므로 어떤 상황에서는 교착 상태가 될 수 있습니다.

희망이 도움이됩니다.

감사합니다,

필리페

+0

감사 필리페. 이전에 HiLo의 잠금 문제를 발견하지 못했습니다. 그것에 대해 더 깊이 알고 있습니까? – UpTheCreek

+0

@UTC - 실제로 잠금 문제는 각 엔티티가 열을 사용하지만 모든 정보가 같은 행에 있으며 NH는 다른 세션 팩토리가 ID를 가져 오지 않도록 전체 행을 잠급니다. . 그래서 'where' 커스텀 파라미터를 사용하는 것을 추천합니다. 각 엔티티는 (동일한 테이블에) 자신의 라인을 가질 것입니다. – jfneis

+0

내 소식은 전략에 대해 분명히 알지 못했다고 생각합니다. 나는 약간의 말을 바꾸고 이해를 보증하기 위해 다른 사람들을 굵게 만들었다. 희망이 도움이! 건배. – jfneis

2

당신은 아마 오래과 안전 해요 싶습니다.

어쨌든 이 없으면 모든 항목에 동일한 표가 사용됩니다. 각 발전기의 table 매개 변수를 다른 값으로 설정할 수 있습니다. 디에고의 답변을 보완

관련 문제