1. 주식별자(Primary Identifier) 선정 원칙
- 주식별자 속성이 변경되지 않아야 함
→ 업무가 변경되어 주식별자가 변경될 여지가 있다면 인조식별자 채택 검토
→ 가장 중요한 원칙으로, 엔터티를 명확하게 분석하고 정의하여 주식별자가 변경되지 않도록 선정
- 주식별자 속성값이 변경되지 않아야 함
→ 주식별자 속성이 바뀌는 것보다 더 심각한 문제
→ 종속자(Depedent)속성, 추출속성, String속성, 횟수/금액 도메인 속성 등의 변경 여지가 있는 속성은 부적절
→ 자식엔터티 존재 시 주식별자 속성값이 변경되면 타 엔터티 내 외래식별자 값도 변경해야 하기 때문에 각종 문제 발생
→ 단, 이력관리 엔터티 등의 사유로 자식 엔터티가 미존재하는 경우 주식별자 값이 변경되어도 문제되지 않을 수 있다.
- 최소한의 속성으로 구성
→ 주식별자를 구성하는 속성이 많아지면 가독성이 떨어짐
→ 관계 상속이 깊어질수록 하위엔터티의 주식별자 속성이 늘어날 수 있음
→ Join 구문이 복잡해져서 SQL이 길어짐(Index 측면에서도 크기를 줄이는게 좋음)
→ 복합주식별자 채택 시 성능 고려해서 속성 순서 정해야함(Where 절에 사용되며, 분포도가 좋은 속성이 선행)
- 슈퍼식별자 사용 금지
→ 주식별자를 구성하는 속성은 최소가 좋음
→ 즉, 삭제해도 되는 속성을 주식별자에 포함시키지 않는 것이 당연함
- 업무적 활용도가 높은 속성 사용
→ 업무적으로 자주 사용될 가능성이 큰 속성은 그 해당 속성으로 조회가 많다는 것임
→ 너무 많은 속성으로 구성하지 않고, 업무에서 자주 사용되는 업무식별자를 주식별자로 구성하는게 Best
- 인조식별자는 의미부여 하지 않고, 속성에 종속되지 않아야 함
→ 인조식별자는 무의미하게 순차적으로 증가하는 일련번호 형태가 Best
→ 업무적인 의미가 존재한다면 속성으로 관리
→ 만약 인조식별자에 의미를 부여하더라도 속성에 종속된 의미를 부여하는건 절대 피해야 함
- 주식별자 길이는 최소한의 길이로 사용
→ 주식별자가 길면 많은 블록을 사용하고, 인덱스 깊이(Depth)를 깊게 만들기에 저장공간과 성능을 고려해야 함
→ 주식별자에 어떠한 체계도 없다면 VARCHAR 타입보단 NUMBER 타입이 더 효율적
- 주식별자 속성값엔 논리적으로 Null 값이 존재하지 않아야 함
→ 주식별자는 당연히 물리적으로 Null 값을 사용할 수 없으나, Default 값으로 Null을 대신하는 알 수 없는 데이터 사용 多
→ 엔터티를 통합하는 경우를 제외하곤 주식별자 값이 논리적으로도 Null 값이 사용되지 않아야 함
- 주식별자 속성값은 가능한 고정길이 채택
→ 고정길이를 사용하는 것이 CHAR 타입을 선택해야 하는 것은 아님(CHAR 타입은 어떤 상황에서도 이득이 없음)
→ 베타속성의 경우 값의 길이가 달라질 수 있으나, 가능한 길이를 같게 선정(성격을 더욱 명확히 하기 위함)
- 업무식별자와 인조식별자를 혼합해서 사용하지 않아야 함
→ 부분 인조식별자가 사용되면 업무식별자를 파악하기 어려워 가독성이 떨어짐(인스턴스 생성기준 불명확)
→ 업무식별자를 주식별자로 선정하는 것이 가장 좋으나, 효율 측면에서 인조식별자를 사용할 순 있음
→ 즉, 인조식별자 사용 자체를 지양하는 것이 아닌, 업무식별자만 쓰거나, 인조식별자만 쓰는 것이 바람직
2. 후보식별자 중 주식별자 선정 기준
- 시간이 지나도 값이 바뀌지 않을 후보식별자
- 논리적으로도 Null이 없는 후보식별자
- 속성 길이가 짧고, 체계가 존재하지 않는 간결한 형태의 후보식별자
- 복합식별자 보단, 단일식별자
- 업무를 대표할 수 있는(업무식별자 역할) 후보식별자
- 값이 암호화되지 않는(주민등록번호 등이 아닌) 후보식별자
3. 인조식별자 채택 기준
- 업무식별자가 여러 속성으로 구성될 때
- 업무식별자 혹은 업무식별자 값이 변경될 여지가 있을 때
- 업무식별자 값에 Null이 포함될 수 있을 때
- 업무식별자에 체계(의미)가 존재할 때
- 업무식별자 길이를 줄일 필요가 있을 때
- 시스템 내부적으로만 사용할 인조식별자를 도입할 때
- 업무식별자 값에 보안 적용이 필요할 때
4. 주식별자 선정 절차
'Data architecture > Model' 카테고리의 다른 글
[Model] 데이터 모델링 매뉴얼 (1) | 2023.09.17 |
---|---|
[Model] 식별자(Unique Identifier)란? (0) | 2023.05.31 |
[Model] 데이터베이스 정규화(Normalization) (0) | 2023.04.12 |