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) 식별자와 비식별자를 적용한 데이터 모델
문서에 대하여
- 최초작성자 : 강정식
- 최초작성일 : 2013년 09월 14일
- 이 문서는 오라클클럽 오라클 성능 트러블슈팅 스터디 모임에서 작성하였습니다.
- 이 문서의 내용은 한국 데이터베이스 진흥원에서 출간한 'SQL 전문가 가이드'를 참고하였습니다.
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=27427078&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
'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 |