식별자(Identifiers)에 대해 알아봤습니다.

2024. 7. 23. 20:34SQL

 

1. 식별자(Identifiers) 개념

엔티티는 인스턴스들의 집합

집합체를 담고 있는 하나의 통에서 각각을 구분할 수 있는 논리적인 이름(폴더명? 네이밍태그?)

이것을 식별자.

여러 개의 속성 중에 엔티티를 대표할 수 있는 속성을 의미.

하나의 엔티티는 반드시 하나의 유일한 식별자가 존재해야 함.

식별자 ≠ 키

식별자라는 용어는 업무적으로 구분이 되는 정보로 생각할 수 있으므로 논리 데이터 모델링 단게에서 사용하고 키는 데이터베이스 테이블에 접근을 위한 매개체로서 물리 데이터 모델링 단계에서 사용.

 

2. 식별자의 특징

주식별자일 경우 다음과 같은 특징.

  • 주식별자에 의해 엔티티내에 모든 인스턴스들이 유일하게 구분되어야함.
  • 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야함
  • 지적된 주식별자의 값은 자주 변하지 않는 것이어야함.
  • 주식별자가 지정이 되면 반드시 값이 들어와야 함.

대체식별자의 특징은 주식별자의 특징과 일치하지만 외부식별자는 별도의 특징을 가지고 있음.

외부식별자의 경우 주식별자 특징과 일치하지 않음. 참조무결성 제약조건(Referential Integrity)에 따른 특징을 가짐.

 

3. 식별자 분류 및 표기법

가. 식별자 분류

대표성을 가지는가? = 주식별자/보조식별자

스스로 생성되었는가? = 내부식별자/외부식별자

단일속성으로 식별이 되는가? = 단일식별자/복합식별자

원래 업무적으로 의미가 있던 식별자 속성을 대체하여 새롭게 만든식별자를 구분해야하는가? = 본질식별자/인조식별자

 

나. 식별자 표기법

 

4. 주식별자 도출기준

중요한 작업 중 하나가 주식별자 도출임.

  • 업무에서 자주 이용되는 속성을 주식별자로 지정
  • 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않음(명칭, 내역)
  • 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 함.

 

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

직원이라는 엔티티 - 유일하게 식별가능한 속성으로는 주민등록번호와 사원번호

사원번호는 회사에서 흔히 사용하므로 주식별자, 주민등록번호는 보조식별자로 사용.

 

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

이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않도록 함. (예 : 부서이름)

부서이름을 주식별자로 지정하면 데이터 읽기 시 어려움. 부서이름이 WHERE 조건절에 기술되는 현상이 발생. 이름이 많은 경우 20자 이상이 될 수 있으므로 조건절에 정확한 부서이름을 기술하는 건 쉽지 않음.

다른 대체방법이 없을 경우 새로운 식별자를 생성함. 보통 일련번호와 코드를 많이 사용.

부서명과 같은 경우는 부서코드를 부여, 코드엔티티에 등록 후 부서코드로 주식별자를 지정하는 방법,

부서일련번호(부서번호)를 주식별자로하고 부서명은 보조식별자로 활용하는 두가지 방법이 있음.

 

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

주식별자의 속성의 수가 많지 않도록 해야함.

자식엔티티로부터 손자엔티티, 증손자엔티티까지 계속해서 상속이 되는 속성이고 복잡한 데이터 모델이 구현되어 물리데이터베이스에서 조인으로 인한 성능저하가 예상된다면 하나의 테이블에 많은 속성이 있는 것이 인정될 수 있음.

하지만 일반적으로 속성의 개수가 많다는 것(7~8개)는 새로운 인조식별자를 생성하여 데이터모델을 구성하는 것이 데이터 모델을 한 층 더 단순하게 하고 조건절을 단순하게 할 수 있음.

(유전할 특성이 많거나 성능이 떨어지면 허용 그치만 데이터모델이 드럽게 변함..)

 

예시에서 접수의 주 식별자가 너무 복잡함. PK가 7개가 생성될 것이므로 SQL문장이 복잡해짐. 

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

 

인조식별자로 대체한다면 간단해짐.

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

(개불편해지니까 과도한 주식별자는 배제하도록 해야함)

 

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

외부식별자(Foreign identifier)는 다른 엔티티와의 관계를 통해 자식 쪽에서 엔티티가 생성되는 속성임. 데이터베이스 생성 시  Foreign Key역할을 함. 모델을 정의하면 논리적으로 자연스럽게 외부식별자가 도출되지만 고려야해야 할 사항이 있음.

부모쪽의 주식별자를 자식엔티티의 속성으로 내려보냄. 외부식별자를 자신의 주 식별자로 이용할 것인지 또는 부모와 연결이 되는 속성으로써만 이용할것인지 결정해야함.

 

나. 식별자관계

자식엔티티의 주 식별자로 이용하는 경우 Null값이 오면 안되므로 반드시 부모엔티티가 생성되어야 자기 자신의 엔티티가 생성되는 경우임. 만약 부모로부터 받은 속성을 포함하여 다른 부모엔티티에서 받은 속성을 포함하거나 스스로 가지고 있는 속성과 함게 주식별자로 구성되는 경우는 1:M 관계가 됨.

발령엔티티는 반드시 사원엔티티가 있어야 자신이 생성될 수 있고 주식별자도 부모엔티티의 외부식별자 사원번호와 자신의 속성 발령번호로 이루어져 있음을 알 수 있음. 이 때 사원과 발령의 관계는 1:M관계.

이와 같이 자식엔티티의 주식별자로 부모의 주식별자가 상속이 되는 경우를 식별자 관계(Identifying Relationship)이라고 지칭.

 

다. 비식별자관계

부모엔티티로 속성을 받았지만, 자식엔티티의 주식별자로 사용하지 않고 일반적인 속성으로 사용하는 경우 비식별자관계(Non-Identifying Relationship)라고 함. 4가지 경우 외부속성 생성.

1) 자식엔티티에서 받은 속성이 반드시 필수가 아니어도 될 때. 부모없는 자식이 생성될 경우

2) 엔티티의 데이터 생명주기를 다르게 관리할 경우. 자식만 남겨두고 먼저 소멸될 경우이다. 해결방안으로 물리데이터베이스 생성 시 FK를 연결하지 않는 임시적인 방법도 있지만 비식별자관계로 조정하는 것이 가장 좋음

3) 여러개의 엔티티가 하나의 엔티티로 통합되어 표현되었는데, 각각 엔티티가 별도의 관계를 가지는 경우.

4) 자식엔티티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때 비식별자 관계에 의한 외부식별자로 표현

3) 접수엔티티의 주식별자로 사용할 수 없는 모습.
4) 계약번호 단독으로도 구성하는 것이 더 효율적이라고 판단하여 독립시킴.

(1.엄마아빠한테 받는 유전이 필요없을 때. 2.엄마아빠가 먼저 생명주기가 다했을때 3.첫째,둘째,셋째 처럼 공통되는 용어가 있을때 4. 유전받는게 더 손해일때)

 

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

 

PLANT 엔티티에는 PK 속성 수가 1개 관계가 1:m이므로 자식엔티티는 PLANT의 엔티티 PK 속성의 수 + 1 이 됨.

그럼 규칙에 의해 데이터모델의 흐름이 길어질수록 증가할 수 밖에 없는 구조가 됨.

(고성이씨 OO공파의 34대손의 아들로써 가운데 이름은 'O'자를 돌림하여 부르는 이름 = 너무 길어짐 -> 누구집안 아들 이OO)

 

WHERE 절이 길어지므로 생성된 엔티티 스키마 정보만을 보고 개발하지 말고 식별자 관계만으로 연결하지 말아라.

식별자 관계만으로 연결된 데이터 모델의 특징은 주식별자 속성이 지속적으로 증가할 수 밖에 없는 구조. 개발자복잡성과 오류가능성을 유발시킬 수 있는 요인임.

 

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

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

식별자관계와 비식별자관계를 취사선택하여 연결하는 내공은 높은 수준의 기술을 요함. 식별자관계에서 비식별자관계를 파악하는 기술이 필요. 흐름(Flow)에 따라 비식별자관계를 선정한다면 합리적으로 관계를 설정할 수 있음.

다음 조건에 해당할 경우 비식별자관계로 조정하면 됨.

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

 

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

강한관계인 식별자관계와 약한관계인 비식별자 관계를 비교함.

 

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

 

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

반응형