식별자는 엔티티에 존재하는 인스턴스의 유일성을 보장합니다. 엔티티 내 인스턴스마다 서로 다른 값을 갖는 속성이 식별자입니다.
업무적으로 구분하게 하는 식별자를 업무 식별자, 물리적으로 인스턴스를 구분하게 하는 식별자는 주 식별자 입니다.
업무 식별자가 어떠하냐에 따라 데이터 관리 방법은 달라집니다.
엔티티가 종속 엔티티일 때는 식별자가 애매할 수 있습니다.
고객 테이블 - 고객번호
고객주소 테이블 - 고객번호 (FK) / 주소 순번 / 주소 유형코드 / 우편번호 / 우편주소
고객주소 엔티티는 종속 엔티티로 고객별 집주소, 회사주소 등 주소가 여러개 존재할 수 있어 주소 순번 속성이 주 식별자로 사용됐습니다.
하지만 고객주소 엔티티의 업무 식별자는 고객번호 속성과 주소 유형코드 속입니다.
종속 엔티티도 업무적으로 인스턴스를 구별하게 하는 속성이 업무 식별자가 됩니다. 상속받은 부모 엔티티의 주 식별자도 업무 식별자에 포함되어 고객번호와 주소유형코드 속성이 주 식별자이면서 업무 식별자가 됩니다. 주소유형코드 속성은 고객주소 엔티티의 부분 주식별자 라고 합니다. 종속 엔티티일 때 부모 엔티티의 주 식별자와 자식 엔티티의 주 식별자를 합쳐야 자신의 주 식별자가 됩니다.
업무 식별자는 몇 가지 제약과 특징이 있습니다. 우선 유일한 값을 가져야 합니다.
업무 식별자는 Null 값을 가지면 안됩니다. 모르는 값이 업무 식별자가 돼서는 안됩니다.
업무 식별자는 수정되지 않습니다. 인스턴스를 발생시키는 기준이므로 값을 변경하는 것은 올바르지 않습니다.
이것은 하위 자식 엔티티에 영향을 미쳐 주식별자로 사용된 업무식별자의 값은 변경하지 않는 것이 원칙입니다.
식별자의 중요한 역할 중 하나는 정규화를 수행하는 기준이 됩니다. 식별자가 결정자가 되면 그 결정자에 따른 종속자를 결정할 수 있습니다.
결정자에 의해 정규화가 이루어지면 정규화는 데이터 모델링의 시발점으로 식별자가 정확히 규명돼야 모델링의 가장 기초 근거가 생기게 됩니다.
모델링의 초반 단계인 개념 모델링 단계에서 업무 식별자를 도출해야 한다고 생각합니다.
개념 모델링은 중요한 엔티티를 도출하고 그 엔티티 사이의 관계를 도출하는 단계입니다.
중요한 엔티티를 도출할 때 업무 식별자가 무엇인지 정의해야 합니다.
최종 모델인 물리 모델에서는 주 식별자(PK)가 정해지게 됩니다. 대부분 업무 식별자가 주 식별자로 결정되지만 업무 식별자의 채택이 여러 가지 이유로 불리할 때는 업무 식별자를 대체해 실제 사용할 인조 식별자가 주 식별자가 됩니다.
엔티티에서 주 식별자가 반드시 존재해야 하듯 업무 식별자도 반드시 존재해야 합니다.
식별자는 사용 용도에 따라 여러 종류로 분류됩니다.
후보 식별자, 후보 키
릴레이션에서 인스턴스 유일성을 보장하며 최소로 구성된 속성이 후보 식별자 입니다.
인스턴스를 유일하게 식별하게 하는 후보 식별자는 하나의 엔티티에 여러 개가 존재할 수 있습니다.
여러 개의 후보 식별자 중에서 결국 주 식별자가 결정됩니다. 주 식별자가 될 수 있는 후보이므로 후보 식별자라 합니다.
후보 식별자는 엔티티를 정의, 정규화 수행 기준이 되기 때문에 기본적으로 정의해야 하는 식별자입니다. 후보 식별자가 Null을 허용할 수 있다는 것을 제외하면 주 식별자와 성격은 동일합니다. 그래서 인스턴스 유일성을 보장하기 위해 Null을 허용하는 유니크 인덱스를 생성해야 합니다.
대리 식별자, 대리키
후보 식별자가 여러 개면 후보 식별자 중 주 식별자로 선택되고 남은 나머지 후보 식별자를 대리 식별자라 합니다. 대리 식별자는 인조 식별자와 차이가 있습니다.
인조 식별자가 존재할 때는 대리 식별자와 후보 식별자는 동일하며 후보 식별자 중에 주 식별자를 채택할 때는 식별자와 대리 식별자 전체 집합이 후보 식별자가 됩니다.
인조 식별자를 채택한 엔티티는 업무 식별자를 관리해야 합니다. 인조 식별자는 의미없는 일련번호일 경우가 많은데 어떤 속성이 업무 식별자인지 모르면 새로운 인스턴스가 어떤 기준에 의해 생성되는지 알 수 없게 된다.
인조식별자, 인조 키
하나 또는 두 개 이상 존재하는 후보 식별자 중 식별자로 사용할 후보가 없을 때 일련번호 등의 단독 속성을 이용해 새로운 식별자를 만듭니다. 이렇게 생성된 식별자를 인조 식별자라고 합니다.
주로 ~코드, ~번호 속성이 무의미한 일련번호로 사용됩니다.
인조 식별자 내에 업무 규칙을 부여하는 것은 좋지 않습니다.
인조 식별자를 채택하면 모델이 단순해지고 SQL도 단순해집니다. 반면, 인조 식별자 단점은 인스턴스가 새로 생성되는 기준을 인조 식별자만 보고는 알 수 없습니다.
업무 식별자를 주 식별자로 사용하는 것을 원칙으로 하면서 업무 식별자가 복잡하면 인조 식별자를 채택합니다.
외래 식별자, 외래키
외래 식별자는 엔티티 간 관계에서 발생합니다. 상위 엔티티의 주 식별자가 하위 엔티티의 외래 식별자 속성이 되고 CASE 툴에서 FK로 표현됩니다.
슈퍼 식별자, 슈퍼 키
슈퍼 식별자는 후보 식별자에 속성을 추가해서 만든 식별자를 의미합니다.
주 식별자 선정 원칙
주 식별자 또는 주 키를 선정하는 원칙은 속성이 변경되지 않도록 선정합니다.
주 식별자가 변경되는 가장 큰 원인은 엔티티를 잘못 분석했거나 엔티티 정의가 명확하지 않고 애매하기 때문입니다.
주 식별자가 변경되는 이유 중 업무 규칙이 변할 때가 있습니다. 요구사항이 바뀌는 경우로 업무 담당자가 프로젝트 시작 전이나 분석 단계 등 초반에 생각한 방향과 진척되고 나서 생각이 바뀌는 경우가 일반적입니다.
주 식별자 속송의 값이 변경되지 않도록 선정
값이 바뀌지 않도록 주 식별자를 선정하는 것을 주 식별자의 중요한 원칙입니다.
주 식별자 속성이 일반 속성에 종속된 형태로 사용하면 안됩니다. 종속자 속성이 주 식별자에 포함되는 것은 적절하지 않습니다. 추출 속성도 주 식별자에 포함되지 않아야 합니다. 추출 속성은 주 식별자가 아니더라도 데이터 정합성을 맞추기 어렵기 때문에 하위 엔티티의 존재 여부와 무관하게 주 식별자로 사용하지 않아야 합니다.
최소한의 속성으로 구성되도록 선정합니다.
주 식별자를 구성하는 속성의 수는 가능한 적을 수록 좋습니다.
계좌 테이블 - 개설지점(주) / 개설상품(주) / 개설순번(주) / 계좌명 / 예수금
이처럼 주 식별자에 속성이 많으면 가독성이 떨어집니다. 다른 엔티티와 관계를 표현하면 가독성이 더 낮아지게 됩니다.
슈퍼 식별자가 되지 않도록 선정
주 식별자를 구성하는 속성 수는 적을수록 좋으며 슈퍼 식별자가 사용되면 안됩니다.
데이터 유일성을 보장하는데 기여하지 않는 속성은 주 식별자에서 제외되어야 합니다.
업무적으로 활용도가 높은 속성으로 선정
여러 후보 식별자 가운데 주 식별자를 선정하는 가장 중요 원칙은 업무 식별자를 가능한 그대로 사용하는 것입니다.
인조 식별자에 의미를 부여하지 않으며 속성에 종속되지 않게 선정
인조 식별자 값에 의미를 부여하지 않아야 합니다.
최소한의 길이가 되도록 식별자 선정
주 식별자 길이는 짧을수록 좋습니다. 20자리에서 10자리로 사용하면 저장공간이 절약됩니다.
주 식별자 속성에 논리적 Null 값이 존재하지 않도록 선정
주 식별자 속성에는 논리적 Null 데이터를 사용할 수 없습니다. 그래서 null이 가능한 속성은 주 식별자에 포함될 수 없습니다.
Null은 알수 없는 값을 의미해서 식별하려는 업무가 적습니다.
주 식별자 속성 값은 가능한 고정 길이가 되도록 합니다.
업무 식별자와 인조 식별자가 혼합되지 않도록 합니다.
순번과 같은 부분 인조 식별자가 사용되면 업무 식별자를 알 수 없게 되어 모델 가독성이 나빠지게 됩니다.
주 식별자는 데이터 성격을 파악할 수 있는 가장 좋은 요소로 업무 식별자를 주 식별자로 사용하는 것이 가장 좋습니다. 업무 식별자가 효율적이지 않을때 인조 식별자를 사용해야 합니다.
업무 식별자와 인조 식별자를 혼합해 사용하는 엔티티 중 대표적인 교차 엔티티는 Association Entity, Intersection Entity, Relationship Entity가 있습니다.
주 식별자 속성은 전사에서 한 번만 사용되도록 선정
엔티티 주 식별자 상속, PK 제약, 유니크 인덱스 (0) | 2024.04.03 |
---|---|
엔티티 주 식별자 선정 방법 (0) | 2024.04.01 |
엔티티 도출과 엔티티명 정의 참고 원칙 (0) | 2024.03.19 |
엔티티 종류 (실체, 행위, 가공, 기준 엔티티) (0) | 2024.03.18 |
슈퍼타입과 서브타입 모델별 사용 장단점 (1) | 2024.02.19 |
댓글 영역