Skip to main content

Command Palette

Search for a command to run...

순번 속성 대신 인조식별자를 사용하는 방법론

Updated
2 min read
💡
이 글은 본질식별자(Natural Key)에 대한 이해가 있는 독자를 대상으로 합니다.
  • 본질식별자에 발생시각 속성이 있을 때, 물리적으로 동일 시각에 여러 인스턴스가 발생하여 유일성이 깨지는 문제를 해결하기 위해 순번을 부분 인조식별자를 추가하는 경우가 있다.

  • 식별자를 이렇게 설계할 경우, 순번 속성의 추가가 식별자의 수를 늘리고 성능에 악영향을 줄 수 있다. 이때 일련번호성 인조식별자를 도출하여 여기에 순번의 역할을 부여하면 본질식별자에 순번 속성을 추가하지 않으면서도 유일성(엔터티 무결성)을 유지할 수 있다. (어차피 도출할 인조식별자라면 부분 인조식별자 말고 전체 인조식별자*를 도출하자는 아이디어)

  • 본질식별자에 UK(Unique Key)를 설정하는 규칙/컨벤션을 가지고 있었다면, 이 경우에는 설정하는 것이 의미가 없다. PK가 자력으로 Unique하므로 PK를 포함하여 구성한 복합 UK는 항상 Super UK가 되기 때문이다.

예시

  • 순번 속성을 사용하는 본질식별자
주문 엔터티본질식별자 의미
#%고객ID누가
#%상품ID무엇을
#%주문일자언제
#%주문순번언제2(시각의 순서를 구별)
  • 전체 인조식별자를 사용
주문 엔터티본질식별자 의미
#%주문번호언제2(시각의 순서를 구별)
%고객ID누가
%상품ID무엇을
%주문일자언제
%주문순번

※ #은 PK, %는 본질식별자임

순번 속성 대신 전체 인조식별자 사용시 상대적 장단점

  • 장점

    • 엔터티 내 순번 속성 하나를 없앨 수 있음

    • 전체 인조식별자 도출로 인해 PK 구성 컬럼 수가 1개로 간소화됨
      순번 속성이 필요한 경우는 본질식별자에 시간의 개념까지 필요하다는 것이므로 식별자가 3개 이상으로 구성될 가능성이 매우 높음. 따라서 원래 인조식별자 도출이 더 유리할 가능성이 높은 경우임

    • 인덱스 크기가 작음
      주문순번은 조건절에서 검색할 일이 없으므로, PK 인덱스에 있어도 사용되지 않고 인덱스 크기만 크게 만듦

    • 인조식별자의 일반적 장점들(e.g., 개발생산성 ↑, 식별자 상속이 용이함 등)

  • 단점

    • 본질식별자를 사용하지 않음으로써 발생하는 일반적 단점들(e.g., 식별자의 데이터 가치 없어짐, 조상 엔터티 참조 어려움 등)

주의사항

이력관리를 위해 사용하는 순번 속성은 전체 인조식별자로 대체하면 안 된다. 여기서의 순번은 동일 인스턴스(마스터 엔터티의 PK) 내에서 시간 순서를 구별하는 용도이며, 식별하는 인스턴스(PK) 자체가 달라져서는 안 되기 때문이다. 따라서 이 방법론의 적용은 일반적으로 행위시점을 본질식별자로 포함할 것이 고려되는 행위 엔터티가 대상이 될 것이다.

* 전체 인조식별자: 이 문서에서는 "부분 인조식별자"와 구별이 필요한 경우, 엔터티의 주식별자로 도출한 인조식별자를 "전체 인조식별자"로 표현한다.