CS/DataBase

ORACLE 식별자

prden 2022. 12. 31. 13:17

식별자 분류 방식

  • 속성 수에 따라 단일 식별자(하나의 속성으로 구성된 식별자), 복합 식별자( 둘 이상의 속성으로 구성된 식별자) 예를 들어 교육 이력 table에서 사원번호와 수강일자를 복합 식별자로 가질 수 있다.
  • 대체 여부에 따라 본질식별자(업무에 의해 만들어지는 식별자)와 인조식별자(업무적으로 만들어지지는 않지만 원조 식별자가 복잡한 구성을 갖고 있어서 인위적으로 만든 식별자) 예를 들어 접수 테이블에서 접수번호 = 관할부서(3) + 접수일자(8) + 일련번호(3)로 인조식별자를 통해 구성할 수 있다.
  • 외부식별자는 자기 자신의 엔터티에서 필요한 속성이 아닌 다른 엔터티와의 관계에서 자식쪽에 생성되는 엔터티에 생성되는 속성을 말한다. (데이터 베이스 생성시 Foreign Key 역할을 함) 외부식별자를 자신의 주식별자로 이용하면 복합키가 되는 것이고 부모와 연결이 되는 속성으로만 이용하면 고유한 FK가 되는 것

식별 관계 vs. 비 식별 관계

1. 식별자 관계란?

부모 테이블의 기본 키나 유니크 키를 자식 테이블 자신이 주식별자인 기본 키로 이용하는 것을 말한다. 즉, 부모 데이터가 존재해야 자식 데이터를 추가할 수 있다. (실선 표기)

ex) 게시판 - 첨부파일 관계에서 게시물이 등록되지 않은 상태에서 첨부파일은 등록될 수 없다. 따라서 식별 관계

2. 비식별 관계란?

부모 케이블의 기본 키나 유니크 키를 자식 테이블이 외래 키로 사용하고 별도의 PK를 생성. 즉, 부모 데이터가 없어도 자식 테이블에 데이터를 추가할 수 있다. (점선 표기)

ex) 사원-부서 관계에서 사원이 부서에 미 배정된 상태 있을 수 있으니 비식별 관계.

3. 결론

비식별 관계로 설계하는 것을 권장한다. (식별자 관계로만 ERD 구성시 PK가 너무 복합키로 커지고, 비식별자 관계로만 ERD 구성시 자식 엔터티에서 데이터를 처리할 때 불필요하게 부모엔터티 까지 찾아가야 하는 문제가 있다.) SQL 전문가 가이드 p 73 ~ p 77 참고.

식별자 관계  비식별자 관계
강한 연결관계 표현 약한 연결관계 표현
자식 주식별자의 구성에 포함됨. 자식 일반속성에 포함됨
실선 표현 점선표현
반드시 부모 엔터티에 종속, 자식 주식별자 구성에 부모 주식별자 포함 필요함. 약한 종속관계, 자식 주식별자  구성을 독립적으로 구성, 
상속받은 주식별자속성을 타엔터티에 이전 필요할 경우 상속방는 주식별자 속성을 타엔터티에 차단 필요할 경우, 
부모 쪽의 관계참여가 선택관계

기본키는 변하면 안 되므로 Mysql에서는 Long타입으로 AUTOINCREMENT를 기본키에 주는 것이 이상적이다. 

 

본질 식별자 vs. 인조 식별자

본질 식별자 : 업무에 의해 만들어진 식별자

인조 식별자 : 업무적으로 만들어지지는 않지만 본질 식별자가 복잡한 구성을 갖고 있으므로 인위적으로 만든 식별자 

 

외부식별자를 준 경우 SQL전문가 가이드 P116

- 주문 상세 테이블에서 식별자를 주문 상세 번호로 (오라클은 SEQ.NEXTVAL, MySQL 은 AutoIncrement) 외부 식별자를 사용했을 때 발생하는 문제점 2가지 SQL 전문가 가이드 P 117 ~

 

1) 중복 데이터로 인한 품질 문제 

주문 상세 번호에 기본키 제약이 적용되고 주문 상세 번호는 시퀀스를 사용하였기에 오류로 인해 Insert문이 두 번 실행될 경우 중복된 데이터가 발생한다 이를 예방하기 위해 애플리케이션에서 작업을 해주어야 함. 

주문번호 + 주문 순번을 식별자(본질 식별자)로 사용할 경우 DBMS에서 오류 원천적으로 차단해줌.

 

2) 불필요한 인덱스 생성

p119 SQL전문가 가이드

인조 식별자를 사용할 경우 주문번호 + 상품번호에 별도의 인덱스를 걸어주어야 한다. 본질 식별자를 구성하면 pk인덱스를 활용하면 된다.. 

 

'CS > DataBase' 카테고리의 다른 글

Pro*C  (0) 2023.01.08
ORACLE 실행계획, Hint, SQL 튜닝  (0) 2022.12.31
DB ConnectionPool  (0) 2022.12.30
Lock 과 트랜잭션 동시성 제어  (0) 2022.12.29
Oracle PL/SQL  (0) 2022.12.29