식별자(Identifier)

2023. 3. 2. 15:21SQL/SQL 전문가 가이드(2020 개정판)

1. 식별자 개념

식별자란 하나의 엔터티에 구성된 여러 개의 속성 중에 엔터티를 대표할 수 있는 속성을 의미하며, 하나의 엔터티는 반드시 하나의 유일한 식별자가 존재해야 합니다. 업무적으로 구분되는 정보로 생각할 수 있기에 논리 데이터 모델링 단계에서 사용하고, 키는 데이터베이스 테이블에 접근을 위한 매개체로서 물리 데이터 모델링 단계에서 사용합니다.

2. 식별자의 특징

■ 주식별자에 의해 엔터티 내에 모든 인스턴스들이 유일하게 구분되어야 합니다.

■ 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 합니다.

■ 지정된 주식별자의 값은 자주 변하지 않는 것이어야 합니다.

■ 주식별자가 지정이 되면 반드시 값이 들어와야 합니다.

3. 식별자 분류 및 표기법

가. 식별자 분류

식별자의 종류는 자신의 엔터티 내에서 대표성을 가지는가에 따라 주식별자(Primary Identifier)와 보조식별자(Alternate Identifier)로 구분하고, 엔터티 내에서 스스로 생성되었는지 여부에 따라 내부식별자와 외부식별자(Foreign Identifier)로 구분할 수 있습니다.

가. 식별자 표기법

4. 주식별자 도출기준

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

■ 명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않습니다.

■ 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 합니다.

 

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

사원번호가 그 회사에서 직원을 관리할 때, 흔히 사용되므로 사원번호를 주식별자로 지정하고, 주민등록번호는 보조식별자로 사용할 수 있습니다.

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

명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않도록 합니다. 명칭이나 내역이 있고, 인스턴스들을 식별할 수 있는 다른 구분자가 존재하지 않을 경우는 새로운 식별자를 생성하도록 합니다.

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

주식별자로 선정하기 위한 속성이 복합으로 구성되어 주식별자가 될 수 있을 때, 가능하면 주식별자 선정하기 위한 속성의 수가 많지 않도록 해야 합니다. 일반적으로 주식별자의 속성의 개수가 많다는 것(일반적으로 7~8개 이상)은 새로운 인조식별자(Artificial Identifier)를 생성하여 데이터 모델을 구성하는 것이 데이터 모델을 한층 더 단순하게 하고, 애플리케이션을 개발할 때 조건절을 단순하게 할 수 있는 방법이 될 수 있습니다.

접수의 주식별자가 접수일자, 관할부서, 입력자사번, 접수방법코드, 신청인구분코드, 신청자주민번호, 신청횟수 등 7개 이상의 복잡한 속성을 가집니다. 실제 테이블에 Primary Key는 7개가 생성될 것이며, 특정 신청인의 계약금 하나만 가져온다고 하더라도 다음과 같이 복잡한 SQL 문장을 구사해야 합니다.

SELECT	계약금
FROM	접수
WHERE	접수.접수일자 = '2010.07.15'
  AND	접수.관할부서	= '1001'
  AND	접수.입력자사번 = 'AB45588'
  AND	접수.접수방법코드 = 'E'
  AND	접수.신청인구분코드 = '01'
  AND	접수.신청인주민번호 = '7007171234567'
  AND	접수.신청횟수	= '1'

이렇게 된 SQL 문장을 접수번호라 하는 인조식별자로 대체했다고 하면 특정 신청인의 계약금 조회는 다음과 같이 간단하게 할 수 있습니다.

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

모델 상에 표현하는 문장의 간편성뿐만 아니라 어플리케이션 구성에 있어서도 복잡한 소스 구성을 피하기 위하여 과도한 복합키는 배제하도록 노력해야 합니다.

 

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

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

외부식별자(Foreign Identifier)는 자기 자신의 엔터티에서 필요한 속성이 아니라 다른 엔터티와의 관계를 통해 자식 쪽에 엔터티에 생성되는 속성을 말합니다.

나. 식별자관계

부모로부터 받은 식별자를 자식엔터티의 주식별자로 이용하는 경우는 Null값이 오면 안 되므로 반드시 부모엔터티가 생성되어야 자기 자신의 엔터티가 생성되는 경우입니다.

다. 비식별자관계

 

1) 자식엔터티에서 받은 속성이 반드시 필수가 아니어도 무방하므로 부모 없는 자식이 생성될 수 있는 경우입니다.

2) 엔터티별로 데이터의 생명주기(Life Cycle)를 다르게 관리할 경우입니다.

3) 여러 개의 엔터티가 하나의 엔터티로 통합·표현되었는데, 각각의 엔터티가 별도의 관계를 가질 때가 이에 해당됩니다.

 

접수 엔터티가 인터넷접수, 내방접수, 전화접수가 하나로 통합되어 표현된 경우에 해당합니다.

 

4) 자식엔터티에 주식별자로 사용하여도 되지만 자식엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때, 비식별자관계에 의한 외부식별자로 표현합니다.

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

데이터 모델은 원시 엔터티였던 PLANT의 경우 단지 한 개의 속성만이 PK속성이었습니다. PLANT 엔터티에는 PK속성 수가 1개이고, 관계가 1:M으로 전개되었으므로 자식엔터티는 PLANET 엔터티의 PK속성의 수 + 1이 성립됩니다.

원 부모엔터티 : 1개
2대 부모엔터티 : 2개 이상 = 원부모 1개 + 추가 1개 이상 +
3대 부모엔터티 : 3개 이상 = 원부모 1개 + 2대 1개 + 추가 1개 이상
3대 부모엔터티 : 3개 이상 = 원부모 1개 + 2대 1개 + 3대 1개 + 추가 1개 이상
4대 부모엔터티 : 4개 이상 = 원부모 1개 + 2대 1개 + 3대 1개 + 4 1개 + 추가 1개 이상 ···

이와 같은 규칙에 의해 지속적으로 식별자 관계를 연결한 데이터 모델의 PK속성의 수는 데이터 모델의 흐름이 길어질수록 증가할 수밖에 없는 구조를 갖게 됩니다.

예시 모델의 맨 하위에 있는 EQPEVTSTSHST에서 다시 새로운 엔터티 EQP_ITEM, EOQ_WORKER와 관계를 맺고 있을 때, 이 세 개의 엔터티에서 정보를 가져오는 SQL 구문을 작성해 봅니다.

SELECT	A.EVENT_ID,
	A.TRANS_TIME,
        A.HST_DEL_FLAG,
        A.STATUS_PROMPT,
        A.STATUS_OLD,
        A.STATUS_NEW
FROM EQPEVTSTSHST A, EQP_ITEM B, EQP_WORKER C
WHERE	A.PLANT				= B.PLANT
AND	A.EQUIPMENT_ID			= B.EQUIPMENT_ID
AND	A.STATUS_ID			= B.STATUS_SEQ
AND	A.EVENT_ID			= B.EVENT_ID
AND	A.TRANS_TIME			= B.TEANS_TIME
AND	A.ITEM_CD			= 'A001'
AND	A.PLANT				= C.PLANT
AND	A.EQUIPMENT_ID			= C.EQUIPMENT_ID
AND	A.STATUS_SEQ			= C.STATUS_SEQ
AND	A.EVENT_ID			= C.EVENT_ID
AND	A.TRANS_TIME			= C.TRANS_TIME
AND	A.WORKER_SID			= 'A012008001'

식별자 관계만으로 연결된 데이터 모델의 특징은 주식별자 속성이 지속적으로 증가할 수밖에 없는 구조로서 개발 복잡성과 오류를 유발하는 요인이 될 수 있습니다.

 

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

일반적으로 각각의 엔터티에는 중요한 기준 속성이 있습니다. 이 기준속성은 부모엔터티에 있는 PK속성으로부터 상속되어 자식엔터티에 존재하는 경우가 많습니다. 이러한 속성의 예로 '주민등록번호', '사원번호', '주문번호', '목록번호' 등을 들 수 있습니다. 데이터 모델링을 전개할 때 각 엔터티 간의 관계를 비식별자관계로 설정하면 이런 유형의 속성이 자식엔터티로 상속되지 않아 자식엔터티에서 데이터를 처리할 때 쓸데없이 부모엔터티까지 찾아가야 하는 경우가 발생합니다,

REP001 T, REP005 T, REP007 T 간의 관계가 비식별자관계로 연결되면서 점검번호, 분야번호 속성이 관계를 타고, 자식엔터티로 내려가는 것을 차단했습니다. 모델의 맨 하위에 있는 REP007T 엔터티에서 어떤 점검에 대한 정보를 보려고 하면, 불필요한 조인이 다량으로 유발되면서 SQL 구문도 길어지고, 성능이 저하되는 현상이 발생합니다.

두 가지 경우에 대해 일정한 규칙을 가지고, 데이터 모델링하는 기술이 필요합니다.

 

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

 

1) 비식별자관계 선택 프로세스

 프로젝트를 전개할 때, 식별자관계와 비식별자관계를 취사선택하여 연결하는 내공은 높은 수준의 기술을 요하고 있습니다. 특히 식별자관계에서 비식별자관계를 파악하는 기술이 필요합니다. 

자식엔터티의 독립된 주식별자 구성이 필요한지를 분석하는 부분입니다. 독립적으로 주식별자를 구성한다는 것은 업무적 필요성과 성능상 필요 여부를 모두 포함하는 의미로 이해하면 됩니다.

 

2) 식별자와 비식별자관계 비교

3) 식별자와 비식별자를 적용한 데이터 모델

'SQL > SQL 전문가 가이드(2020 개정판)' 카테고리의 다른 글

관계(Relationship)와 조인(Join)의 이해  (2) 2023.03.04
정규화(Normalization)  (0) 2023.03.03
관계(Relationship)  (0) 2023.03.01
속성(Attribute)  (0) 2023.02.28
엔터티(Entity)  (0) 2023.02.27