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

HELLO_DINO·2022년 9월 21일
0

SQL전문가가이드

목록 보기
10/28

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


주문 상품 모델의 식별자가 본질식별자이다. 주문상품 모델은 주문 시 구매한 상품 정보를 관리한다.


위의 표는 하나의 주문에 3개의 상품을 구매한 것을 데이터로 표현하였다.
주문상품 모델에 값을 Insert하는 경우를 생각해보자.

쉽게 가능하다.

위의 모델은 주문상품번호라는 새로운 식별자를 생성하였다. 이는 외부식별자이다.
이 모델에서의 Insert문은 다음과 같다.

'주문상품번호SEQ'라는 시퀀스 객체를 생성하고 NEXTVAL 기능을 이용하여 자동으로 값을 채번하여 Insert하는 방식이다. [그림 I-2-21] 모델에 비해 좋은 점이 없다.

그렇다면 이리 하는 이유는 무엇일까?
가장 큰 이유는 본질식별자에 대해 고민하지 않았기 때문이다.


위의 모델을 보자.

하나의 주문에 동일 상품을 중복으로 구매하고 싶다면, [그림 I-2-21] 모델에서는 불가능할 것이다. 상품번호가 중복되기 때문이다. 위의 그림의 주문상세 모델은 상품번호를 식별자로 구성하지 않고 하나의 주문에 발생하는 상품의 Count를 주문순번이라는 속성으로 식별자를 구성하였다.


위의 표에 데이터를 보면, 동일상품을 하나의 주문에서 처리하고 있다. 만일 [그림 I-2-21]와 같은 모델이면 위와 같이 처리하기 위해선 주문을 따로 세 번 해야 할 것이다.

위의 그림으로 개발한다고 생각해보자.

SQL문은 위와 같이 입력될 것이다. 이전 모델과 다른 점은 주문순번 값을 위해 하나의 주문에 구매하는 상품의 Count를 계산하여 입력해야 한다. 이와 같은 작업은 어려운 일은 아니더라도 번거로운 작업이 추가된 것이다.

위의 모델은 식별자를 주문상세번호로 정의하였다. 이전 모델과 차이점은 식별자를 하나의 속성으로 구성한 외부식별자로 생성한 것이다. 주문순번 속성이 사라졌지만 대신 주문상세번호가 생성되었다. 이는 큰 차이가 없어 보이지만 실제 개발 시 편의성이 향상되는 방식이다.


주문상세번호는 단일식별자로 구성된 키값이기 때문에 시퀀스 객체로 해결이 가능하다.

'주문상세번호SEQ'라는 시퀀스 객체를 만들고 NEXTVAL을 활용하면 기본키에 대한 부분은 신경쓰지 않아도 된다. 하지만 여기엔 문제점이 존재한다.

외부식별자를 사용하는 방식에는 크게 두 가지 문제점이 있다.

  • 중복 데이터로 인한 품질
  • 불필요한 인덱스 생성

1. 중복 데이터로 인한 품질 문제
외부식별자를 사용하면 중복 데이터를 막을 수 없다. 기본키의 제약을 활용하면 중복 데이터를 원천 차단할 수 있지만, 기본키를 인위적으로 생성한 속성으로 정의하였기 때문이다.

위의 구문에서 두 번째 Insert문이 로직 오류로 인해 중복으로 발생하였다.
기본키를 인위적인 인조식별자로 구성하였으므로 기본키 제약은 주문상세번호에 대해 적용되어 중복을 막을 수 없다. 그로인해 실제 데이터는 다음과 같이 저장된다.

두 번째 행을 보면, 중복된 데이터이지만 저장된 것을 볼 수 있다.
주문상세번호는 시퀀스를 사용해 제약에 위배된 사항이 없다.

[그림 I-2-24] 주문상세 모델의 본질식별자의 경우는 어떨까?

두 번째 Insert 문을 보면 로직의 오류로 동일한 Insert 문이 발생하지만, '주문번호+주문순번'이 식별자이기에 기본키 제약조건에 의해 에러가 발생한다.

이로 인해 최대한 본질식별자를 지향해야 한다.
만약 외부식별자를 사용한다면, DBMS에서는 해당 경우를 막아줄 수 없어 애플리케이션에서 이를 방어해주어야 한다.

2. 불필요한 인덱스 생성

주문상품 모델 데이터를 액세스한다고 하면, 여러 가지 패턴이 있지만 가장 기본적인 액세스 패턴은 다음 구문과 같을 것이다.

또는 다음 구문과 같을 것이다.

가장 기본적이면서 일반적인 액세스 패턴이다.
본질식별자로 구성하면 PK 인덱스를 활용할 수 있지만, 인조식별자로 구성하면 [그림 I-2-25]의 IX1과 같은 인덱스를 추가 생성해야 한다.

즉 인조식별자는 불필요한 인덱스를 추가 생성해야 한다. 또한 추가로 생성한 인덱스는 용량과 DML 성능에 영향을 줄 수 있다.

식별자 속성이 너무 많아지는 경우 본질식별자와 인조식별자의 장단점을 따져서 인조식별자의 남용을 피하고 꼭 필요한 경우에만 사용하자.

0개의 댓글