DB/SQL 전문가 가이드

[과목 I 1장 5절] 식별자

꾸준함. 2025. 2. 23. 01:09

1. 식별자 개념

  • 엔티티는 인스턴스들의 집합이므로, 이들을 구분하기 위해 식별자(Identifier)라는 논리적 이름을 사용
    • 식별자란 하나의 엔터티에 구성된 여러 개의 속성 중에 엔터티를 대표할 수 있는 속성을 의미
    • 하나의 엔터티는 반드시 하나의 유일한 식별자가 존재해야 함

 

2. 식별자의 특징

  • 주식별자일 경우 다음과 같은 특징을 가짐
    • 유일성: 주식별자에 의해 엔터티 내 모든 인스턴스들이 유일하게 구분되어야 함
    • 최소성: 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함
    • 불변성: 지정된 주식별자의 값은 자주 변하지 않는 것이어야 함
    • 존재성: 주식별자가 지정이 되면 반드시 값이 들어와야 함

 

  • 대체식별자의 특징은 주식별자의 특징과 일치
  • 외부식별자의 경우 주식별자 특징과 일치하지 않으며 참조 무결성 제약 조건 (Referential Integrity)에 따른 특징을 가지고 있음

 

3. 식별자 분류 및 표기법

 

가. 식별자 분류

  • 식별자의 종류는 자신의 엔터티 내에서 대표성을 가지는가에 따라 주식별자 (Primary Identifier)와 보조 식별자 (Alternate Identifier)로 구분
  • 엔터티 내에서 스스로 생성되었는지 여부에 따라 내부 식별자와 외부 식별자 (Foreign Identifier)로 구분
  • 단일 속성으로 식별이 되는가에 따라 단일 식별자 (Single Identifier)와 복합 식별자 (Composite Identifier)로 구분
  • 원래 업무적으로 의미가 있던 식별자 속성을 대체하여 일련번호와 같이 새롭게 만든 식별자를 구분하기 위해 본질 식별자와 인조 식별자로도 구분

 

나. 식별자 표기법

 

https://snnchallenge.tistory.com/189

 

4. 주식별자 도출 기준

  • 주식별자를 도출하기 위한 기준을 정리하면 다음과 같음
    • 해당 업무에서 자주 이용되는 속성을 주식별자로 지정
    • 명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않음
    • 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 함

 

가. 해당 업무에서 자주 이용되는 속성을 주식별자로 지정

  • 직원이라는 엔터티가 있을 때, 유일하게 식별 가능한 속성으로는 주민등록번호와 사원번호가 존재할 수 있음
    • 사원번호가 회사에서 직원을 관리할 때 흔히 사용되므로 사원번호를 주식별자로 지정
    • 주민등록번호는 보조식별자로 사용

 

나. 명칭, 내역 등과 같이 이름으로 기술되는 것은 피함

  • 한 회사에 부서 이름이 100개 있다고 가정했을 때 각각의 부서 이름이 유일하게 구별될 수 있다고 하여 이를 주식별자로 지정하지 않도록 해야 함
    • 부서 이름을 주식별자로 선정할 경우 물리 데이터베이스로 테이블을 생성하여 데이터를 읽을 때 항상 부서 이름이 WHERE 조건절에 기술되는 현상이 발생
    • 부서 이름은 많은 경우 20자 이상이 될 수 있으므로 조건절에 정확한 부서 이름을 기술하기는 쉬운 일이 아님
    • 이와 같이 명칭이나 내역이 있고 인스턴스들을 식별할 수 있는 다른 구분자가 존재하지 않을 경우는 일렬번호와 같이 새로운 식별자를 생성하는 것을 권장

 

다. 속성의 수가 많아지지 않도록 함

  • 주식별자의 속성이 7~8개 이상으로 많아질 경우, 새로운 인조 식별자를 도입해 데이터 모델을 구성함으로써 모델을 단순화하고 애플리케이션 개발 시 조건절 또한 단순화할 수 있음
    • 단, 복잡한 데이터 모델에서 주식별자 속성이 자식·손자·증손자 엔터티까지 상속되어 조인 성능 저하가 예상된다면, 반정규화를 통해 하나의 테이블에 많은 속성을 두는 것도 허용될 수 있음

 

https://snnchallenge.tistory.com/189

 

부연 설명

  • 왼쪽 그림의 상황은 “접수” 엔터티에서 특정 부류의 사람이 동일 날짜와 특정 접수 방법으로 여러 번 신청할 수 있으며, 관할 부서가 담당자의 입력대로 데이터를 구분하는 업무 규칙이 적용되는 사례
  • 접수의 주식별자가 접수일자, 관할부서, 입력자 사번, 접수 방법 코드, 신청인 구분 코드, 신청자 주민번호, 그리고 신청 횟수 등 7개 이상의 복잡한 속성을 가지고 있음
  • 이러한 모델의 경우 실제 테이블에 기본 키는 7개가 생성될 것이며 만약 특정 신청인의 계약금 하나만 가져온다고 하더라도 WHERE 절이 복잡한 SELECT 문이 호출될 것
  • 이렇게 된 SQL 문장을 접수 번호라고 하는 인조 식별자로 대체했다고 하면 특정 신청인의 계약금 조회는 다음과 같이 간단하게 변경 가능

 

SELECT 계약금
FROM 접수
WHERE 접수.접수일자 = '<접수일자>'

 

5. 식별자 관계와 비식별자 관계에 따른 식별자

 

가. 식별자 관계와 비식별자 관계의 결정

  • 외부 식별자 (Foreign Identifier)는 자기 자신의 엔터티에서 필요한 속성이 아니라 다른 엔터티와의 관계를 통해 자식 쪽에 엔터티에 생성되는 속성을 말하며 데이터베이스 생성 시에 외래 키 역할 수행
  • 엔터티에 주식별자가 지정되고 엔터티 간 관계를 연결하면 부모 쪽의 주식별자를 자식 엔터티의 속성으로 내려보냄
    • 이때 자식 엔터티에서 부모 엔터티로부터 받은 외부 식별자를 자신의 주식별자로 이용할 것인지, 부모와 연결이 되는 속성으로서만 이용할 것인지를 결정해야 함

 

https://snnchallenge.tistory.com/190

 

나. 식별자 관계

  • 부모의 식별자를 자식 엔터티의 주식별자로 사용하면 부모 엔터티가 먼저 생성되어야 하며, 자식이 부모의 속성만으로 식별자를 구성할 경우 두 엔터티는 1:1 관계 형성
  • 부모로부터 받은 속성 외에 다른 부모나 자체 속성까지 포함하여 주식별자를 구성하면, 부모와 자식 간 관계는 1:M

 

https://snnchallenge.tistory.com/190

 

부연 설명

  • 사원과 발령의 관계는 1:M 관계
  • 임시직사원의 주식별자는 사원의 주식별자와 동일하므로 사원과 임시직사원의 관계는 1:1 관계
    • 자식 엔터티의 주식별자로 부모의 주식별자가 상속되는 경우를 식별자 관계 (Identifying Relationship)이라고 부름

 

다. 비식별자 관계

  • 부모 엔터티로부터 속성을 받았지만 자식 엔터티의 주식별자로 사용하지 않고 일반적인 속성으로만 사용하는 경우 비식별자 관계 (Non-Identifying Relationship)라고 하며 다음의 네 가지 경우에 비식별자 관계에 의한 외부 속성을 생성함
    • 자식 엔터티에서 받은 속성이 반드시 필수가 아니어도 무방하므로 부모 없는 자식이 생성될 수 있는 경우
    • 엔터티 별로 데이터의 생명 주기를 다르게 관리할 경우
    • 여러 개의 엔터티가 하나의 엔터티로 통합되었는데, 각각의 엔터티가 별도의 관계를 가질 때가 이에 해당
    • 자식 엔터티에 주식별자로 사용하여도 되지만 자식 엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때, 비식별자 관계에 의한 외부 식별자로 표현

 

https://snnchallenge.tistory.com/190
https://snnchallenge.tistory.com/190

 

라. 식별자 관계로만 설정할 경우의 문제점

  • 아래 ERD에서 원시 엔터티였던 PLANT의 경우 단지 한 개의 속성만이 PK 속성
  • 하지만 EQPEVTSTSHST 엔터티는 부모로부터 모두 식별자 관계 연결로 인해 PK 속성의 개수가 무려 5개나 설정됨
    • PLANT 엔터티에는 PK 속성 수가 1개이고 관계가 1:M으로 전개되었으므로 자식 엔터티는 PLANT 엔터티의 PK 속성의 수 + 1이 성립됨
    • 이와 같은 규칙에 의해 지속적으로 식별자 관계를 연결한 데이터 모델의 PK 속성의 수는 데이터 모델의 흐름이 길어질수록 증가할 수밖에 없는 구조를 갖게 됨

https://snnchallenge.tistory.com/190

 

  • 위 예시 모델의 맨 하위에 있는 EQPEVTSTSHST에서 다시 새로운 엔터티 EQP_ITEM, EQP_WORKER와 관계를 맺고 있을 때, 이 세 개의 엔터티에서 정보를 가져오는 SQL 구문을 작성하는 경우 WHERE 절이 매우 길어지는 것을 확인 가능
    • 식별자 관계만으로 연결된 데이터 모델의 특징은 주식별자 속성이 지속적으로 증가할 수 밖에 없는 구조로서 개발 복잡성과 오류를 유발하는 요인이 될 수 있음

 

 

 

마. 비식별자 관계로만 설정할 경우의 문제점

  • 데이터 모델링을 전개할 때 각 엔터티 간의 관계를 비식별자 관계로 설정하면 기준 속성이 자식 엔터티로 상속되지 않아 자식 엔터티에서 데이터를 처리할 때 쓸데없이 부모 엔터티까지 찾아가야 하는 경우 문제 발생

 

https://snnchallenge.tistory.com/190

 

부연 설명

  • REP001T, REP005T, REP007T 간의 관계가 비식별자 관계
    • 점검번호, 분야번호 속성이 관계를 타고 자식엔티티로 내려가는 것을 차단

 

  • 최하단에 있는 REP007T 엔티티에서 어떤 점검 정보를 볼 때, 불필요한 조인 다량 유발하여 성능 저하

 

https://snnchallenge.tistory.com/190

 

바. 식별자 관계와 비식별자 관계 모델링

 

A. 비식별자 관계 선택 프로세스

  • 기본적으로 식별자 관계로 모든 관계가 연결한 뒤 다음 조건에 해당할 경우 비식별자 관계로 조정하면 됨

 

https://snnchallenge.tistory.com/190

 

부연 설명

  • 가장 중요한 요인은 자식 엔터티의 독립된 주식별자 구성이 필요할지를 분석하는 부분
  • 독립적으로 주식별자를 구성한다는 것은 업무적 필요성과 성능상 필요 여부를 모두 포함하는 의미

 

B. 식별자와 비식별자 관계 비교

 

https://snnchallenge.tistory.com/190

 

C. 식별자와 비식별자를 적용한 데이터 모델

  • 하기 모델은 업무의 특성에 따라 식별자 관계와 비식별자 관계를 적절하게 선택함으로써 데이터 모델의 균형감을 갖추었다고 볼 수 있음

 

https://snnchallenge.tistory.com/190

 

참고

SQL 전문가 가이드 2020 개정판 - 한국데이터산업진흥원

반응형

'DB > SQL 전문가 가이드' 카테고리의 다른 글

[과목 I 2장 2절] 관계와 조인의 이해  (1) 2025.03.17
[과목 I 2장 1절] 정규화  (0) 2025.03.17
[과목 I 1장 4절] 관계  (0) 2025.02.22
[과목 I 1장 3절] 속성  (0) 2025.02.22
[과목 I 1장 2절] 엔터티  (0) 2025.02.22