본문 바로가기
IT/SQLD

[SQLD] 과목1_1장_5.식별자

by 윤싱찬 2018. 11. 28.

1. 식별자(Identifiers) 개념

  • 하나의 엔터티에 구성되어 있는 여러 개의 속성 중에, 엔터티를 대표할 수 있는 속성을 의미함
  • 하나의 엔터티는 반드시 하나의 유일한 식별자가 존재해야 함.

2. 식별자의 특징

가) 주식별자

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

나) 외부식별자

*. 주식별자 특징과 일치하지 않으며, 참조무결성 제약조건(Referential Integrity)에 따른 특징을 가짐

3. 식별자 분류 및 표기법

가) 식별자 분류

 
1) 대표성 여부

  • 자신의 엔터티 내에서 대표성을 가지는가에 따라, 주식별자(Primary Identifier)와 보조식별자(Alternate Identifier)로 구분

2) 스스로 생성 여부

  • 엔터티 내에 서 스스로 생성되었는지 여부에 따라, 내부식별자와 외부식별자(Foreign Identifier)로 구분

3) 속성의 수 여부

  • 단일 속성으로 식별 이 되는가에 따라 단일식별자(SingleIdentifier)와 복합식별자(Composit Identifier)로 구분

4) 대체 여부

  • 업무적으로 의미가 있던 식별자 속성을 대체하여, 일련 번호와 같이 새롭게 만든 식별자를 구분하기 위해 본질식별자와 인조식별자로도 구분

나) 식별자 표기법


4. 주식별자 도출기준

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

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

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

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

  • 부서이름을 주식별자로 선정하면 물리데이터베이스로 테이블을 생성하여 데이터를 읽을 때, 항상 부서이름이 WHERE 조건절에 기술되는 현상이 발생됨.
  • 정확한 부서이름을 넣는 것은 쉽지 않으므로, 부서코드로 변경함.
  • 부서명과 같은 경우는 부서코드를 부여하여 코드엔터티에 등록한 후 부서코드로 주식별자를 지정하는 방법과, 부서일련번호(부서변호)를 주식별자로 하고 부서명은 보조식별자로 활용하는 두 가지 방법이 있음.

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

  • 주식별자로 선정하기 위한 속성이 복합으로 구성되어 주식별자가 될 수 있을 때 가능하면 주식별자 선정하기 위한 속성의 수가 많지 않도록 해야 함.
  • 속성의 개수가 많을 경우 새로운 인조식별자(Artificial Identifier)를 생성하여 데이터 모델을 구성하는 것이 개발 시 조건절을 단순화 시킬 수 있음.
  • 주 식별자가 많을 경우
SELECT 계약금
FROM   접수
WHERE  접수.접수일자        = '2010.07.15'
AND    접수.관할부서        = '1001'
AND    접수.입력자사번      = 'AB45588'
AND    접수.접수방법코드    = 'E'
AND    접수.신청인구분묘드  = '01'
AND    접수.신청인주민번호  = '7007171234567'
AND    접수.신청횟수        = '1'
  • 많은 주 식별자를 인조식별자로 대체할 경우
SELECT 계약금
FROM   접수
WHERE  접수.접수일자 = '100120100715001'

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

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

  • 외부식별자(Foreign Identifier)
    • 자기 자신의 엔터티에서 필요한 속성이 아니라 다른 엔터티와의 관계를 통해 자식 쪽에 엔터티에 생성되는 속성
    • 데이터베이스 생성 시에 Foreign Key역할을 함.
  • 자식엔터티에서 부모엔터티로부터 받은 외부식별자를 자신의 주식별자로 이용할 것인지 또는 부모와 연결이 되는 속성으로서만 이용할 것인지를 결정해야 함.

나) 식별자관계

  • 1:1 관계
  • 부모로부터 받은 속성을 자식엔터티가 모두 사용하고 그것만으로 주식별자로 사용할 경우
  • 1:M 관계
    • 부모로부터 받은 속성을 포함하여 다른 부모엔터티에서 받은 속성을 포함하거나 스스로 가지고 있는 속성과 함께 주식별자로 구성되는 경우
  • 식별자 관계란 자식엔터티의 주식별자로 부모의 주식별자가 상속이 되는 경우

  • '사원:발령'의 경우 식별자 관계이며 1:M 관계임
  • '사원:임시직 사원'의 경우 식별자 관계이며, 1:1 관계임. 식별자 관계이며 1:1 일 경우 엔터티 통합 대상이 됨.

다) 비식별자관계

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

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

  • 모든 관계를 식별자 관계로 할 경우 부모의 식별자를 계속 상속 받아야 하므로, 최하위 엔터티의 경우 식별자 개수가 너무 많게 됨

  • 위의 그림처럼 EQPEVTSTSHST 엔터티에서 추가로 조인을 할 경우 SQL은 아래와 같이 나올 수 있다.
SELECT A.EVENT_ID,
       A.TRANS_TIME,
       A.HST_DEL_FLAG,
       A.STATUS_OLD,
       ASTATUS 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_SEQ    = B.STATUS_SEQ
AND    A.EVENT ID      = B.EVENT ID
AND    A.TRANS TIME    = B.TRANS TIME
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    B.ITEM CD       = 'AOOL'
AND    C.WORKER SID    = 'A012008001'
  • 즉, 3개의 테이블만 조인을 하여도 조인키가 너무 많이 생기며, 이 경우 개발 시 조인키가 누락되어 프로젝트에 지장을 줄 수 있음.

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

  • 각 엔터티 간의 관계를 비식별자 관계로 설정하면 자식엔터티에서 데이터를 처리할 때 부모엔터티까지 찾아가야 하는 경우가 발생

  • 위 모델에 있는 맨 하위에 있는 REP007T 엔터티에서 어떤 점검에 대한 정보가 필요하 경우 불필요한 조인이 다량으로 유발되면서 SQL구문도 길어지고 성능이 저하되는 현상이 발생됨

  • (역자 주) 공감이 안됨. 식별자 관계의 경우, 조인키가 없을 경우 어떻게 서로 연결이 되어 있는지 파악이 불가하므로 더욱 혼란만 가중될 것으로 보임

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

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

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

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

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

문서에 대하여

문서정보


'IT > SQLD' 카테고리의 다른 글

[SQLD] 과목1_1장_4.관계  (0) 2018.11.28
[SQLD] 과목1_1장_3.속성  (0) 2018.11.28
[SQLD] 과목1_1장_2.엔터티  (0) 2018.08.16
[SQLD] 과목1_1장_1.데이터 모델의 이해  (0) 2018.08.10