본문 바로가기

데이터 Story/모델링 매뉴얼

주 식별자 설계 원칙-변경되지 않는 속성

 

엔터티의 주 식별자는 다른 엔터티의 외래 식별자(Foreign Identifier)가 되며, 외래 식별자 값에는 주 식별자에 존재하는 값을 사용해야 한다. 따라서 만약 주 식별자 속성 값이 바뀌면 그 값을 사용한 하위 엔터티의 외래 식별자 속성 값도 바꿔야 한다. 그래야 참조 무결성이 지켜진다.

 

하지만 외래 식별자 속성 값을 바꿔주는 것은 쉽지 않다. 대상 엔터티가 한없이 늘어날 수 있으며, 해당 엔터티의 인스턴스도 정확히 지정해야 하기 때문에 쉽지 않은 작업이다. 잘못된 설계로 인해 불가피하게 외래 식별자 속성 값을 바꿔주는 작업을 하는 경우는 있지만, 그렇게 하도록 설계하는 것은 그 자체로 잘못된 설계다.

 

주 식별자 속성 값이 바뀌지 않도록 주 식별자를 선정하는 것은 주 식별자 선정의 중요한 원칙이다. 또한 원칙적으로 주 식별자로 사용되는 업무 식별자는 값이 수정되지 않는다. 업무 식별자의 값은 인스턴스를 발생시키는 기준이 되는데, 그 기준 값이 변경되는 것은 일종의 모순이기 때문이다.

 

[그림1] 고객 엔터티의 주 식별자가 주민등록번호 속성이지만, 암호화 문제가 없다고 하더라도 주민등록번호는 변경될 수 있기 때문에 주 식별자로 적절치 않다.

 

[그림1]

 

만약 ‘홍길동’의 주민등록번호가 ‘123456-7890123’에서 ‘123456-7890128’으로 바뀌면 ‘123456-7890123’ 주민등록번호를 사용한 주문 엔터티나 고객주문집계 엔터티의 외래 식별자 속성 값도 수정해야 ‘홍길동’ 고객이 주문했던 내역도 찾을 수 있고 주문 집계도 구할 수 있다.

 

타 엔터티에 존재하는 값을 어쩔 수 없이 바꾸는 일이 없도록 [그림2] 고객 엔터티와 같이 값이 변하지 않을 속성을 주 식별자로 사용해야 한다.

 

[그림2]

 

위와 같은 이유로 비록 업무 식별자 성격일지라도 이메일 주소나 휴대전화번호를 엔터티의 주 식별자로 사용하는 것도 바람직하지 않다.

 

소속 부서도 주 식별자에 자주 포함되는 속성인데, 소속 부서와 같은 소유의 개념이 있다면 소유가 바뀔 때 주 식별자 값도 바뀌게 된다. 바뀔 수 있는 소속 부서는 주 식별자가 아닌 일반 속성으로 관리해야 한다.

 

명이나 내용 같은 텍스트도 값이 변할 수 있기 때문에 주 식별자로는 적절치 않다. 횟수/수량/금액/여부 등도 변할 수 있는 값으로서 주 식별자로 적절하지 않다.