메뉴 건너뛰기

bysql.net

제5절_식별자

2012.03.04 06:51

ljw 조회 수:18958

1.식별자의 개념

식별자 : 하나의 엔터티에 구성되어 있는 여러 개의 속성 중에 엔터티를 대표할 수 있는 속성.

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

            (식별자-논리 데이터 모델링 / 키-물리 데이터 모델링)

*엔터티 : 인스턴스들의 집합


SQL_048.jpg

2. 식별자의 특징

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

항목

Pirimary key 

Unique index 

목적 

constraint + index 

index 

공통점

유일성보장 

유일성보장 

참조 무결성 

 pk 제약조건

불가 

테이블당 개수

only 1 

여러개 가능 

인덱스 생성 

unique index 

unique index 

역공학 적용시 

pk인식가능

pk인식 불가 

null허용 

허용 안됨 

허용 



3.식별자 분류 및 표기법

가.식별자 종류 

SQL_050.jpg


SQL_051.jpg



나.식별자 표기법

SQL_052.jpg



4.주식별자 도출기준

주식별자 도출기준

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

가.해당업무에서 자주 이용되는 속성을 주식별자로 지정하도록함
사원테이블에서 주식별자는 사번/주민등록번호 둘다 가능
--> 회사에서 직원을 관리할때는 사번이 흔히 사용되므로 사번을 주식별자, 주민등록번호를 보조 식별자로 사용한다.

나.명칭, 내역 등과 같이 이름으로 기술되는 것은 피함
부서이름의 경우 해당 회사에서 유일하게 구별이 가능하나, 실제 개발 업무에서 쓰기 부적합(띄어쓰기, 긴 명칭으로 인한 오류)
--> 일련번호, 코드로 사용

다.속성의 수가 많아지지 않도록 함
주식별자로 선정하기 위한 송성이 복합으로 구성될경우 가능하면 속성의 수가 많지 않도록 해야함.
--> 엔터티간 관계에서 관계가 식별관계일경우 복합 식별자가 그대로 상속되므로 쿼리가 복잡해지며, 물리 데이터 베이스에서
      조인으로 인한 성능저하가 발생할 수 있음.
       --> 인조식별자 사용
SQL_055.jpg

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

/*인조 식별자*/
SELECT 계약금 
   FROM 접수 
  WHERE 접수.접수일자 = ‘100120100715001'


5.식별자관계와 비식별자관계에 따른 식별자
가.식별자관계와 비식별자 관계의 결정
외부식별자 : 자기 자신의 엔터티에서 필요한 속성이 아니라, 다른 엔터티와의 관계를 통해 자식쪽에 엔터티에 생성되는 속성.


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

다.비식별자관계
부모엔터티로 속성을 받았지만 자식엔터티의 주식별자로 사용하지 않고 일반적인 속성으로만 사용하는 경우
  • 자식엔터티에서 받은 속성이 반드시 필수가 아니어도 무방한 경우(부모없는 자식생성 가능)
  • 엔터티별로 데이터의 생명주기를 다르기 관리할 경우. 자식만 남겨두고 부모의 인스턴스가 먼저 소멸되는 경우
  • 여러개의 엔터티가 하나의 엔터티로 통합되고, 각각의 엔터티가 별도의 관계를 가질때
  • 자식엔터티에 주식별자로 사용하여도 되지만, 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될때.
SQL_060.jpg


SQL_061.jpg

라.식별자 관계로만 설정할 경우의 문제점
지속적으로 식별자 관계를 연결한 데이터 모델의 PK속성의 수는 데이터 모델의 흐름이 길어질수록 증가함
SQL_062.jpg

마.비식별자 관계로만 설정할 경우의 문제점
부모엔터티에 있는 PK속성이 자식(정확히는 손자 이후부터)엔터티로 상속되지 않음.
즉 손자 엔터티에서 할아버지 엔터티로 접근할경우 반드시 부모 엔터티를 거쳐야만 접근이 가능하게됨.

SQL_067.jpg

바.식별자관계와 비식별자관계 모델링
1.비식별자관계 선택 프로세스
기본적으로 식별자관계로 모든 관계가 연결되면서 다음 조건에 해당할 경우 비식별자관계로 조정하면 된다.
SQL_069.jpg
가장 중요한 부분은 자식엔터티의 독립된 식별자 구성이 필요한지 여부
(업무적 필요성, 성능상 필요여부 모두)


2.식별자와 비식별자관계 비교
SQL_070.jpg

3.식별자와 비식별자를 적용한 데이터 모델
/*예제 다시 작성*/