본문 바로가기
DB/데이터모델링

데이터모델링이론 - 식별자의 구분 본질식별자와 인조식별자

by 참외롭다 2024. 1. 30.
반응형

데이터모델링이론 - 식별자의 구분 본질식별자와 인조식별자

 

엔터티를 식별할 수 있는 속성을 식별자라고 합니다. 식별자는 대체 가능 여부에 따라 본질식별자와 인조식별자로 분류할 수 있습니다.

 

- 본질식별자 : 업무적 필요성에 의해 만들어진 식별자

 

- 인조식별자 : 업무적 필요성에 의해 만들어지진 않지만 본질식별자가 복잡한 구성일 경우 개발편의성을 위해 인위적으로 만든 식별자

 

주문 시 구매한 상품의 정보를 관리하는 주문상품 엔터티의 경우 주문번호로 레코드를 식별할 수 있으므로 주문번호 칼럼은 본질식별자입니다. 주문의 상세정보를 관리하는 주문상세 엔터티에서 주문번호를 엔터티로 쓰지 않고 주문상품번호 칼럼을 추가해서 식별자로 사용할 때 이는 인조식별자입니다.

 

INSERT INTO 주문상세 VALUES(주문상품번호.SEQ.NETXVAL, 110001, 1234, 1);
INSERT INTO 주문상세 VALUES(주문상품번호.SEQ.NETXVAL, 110002, 1566, 5);
INSERT INTO 주문상세 VALUES(주문상품번호.SEQ.NETXVAL, 110003, 234, 2);

 

주문 엔터티와 관계하는 주문상세애서 인조식별자를 사용하는 것은 본질식별자를 사용하는 것에 비해 나은 점이 없습니다. 오히려 불필요한 시퀀스 생성으로 성능을 감소시킵니다.

 

하나의 주문에 동일 상품을 중복으로 구매할 수 있는 업무의 경우 주문상세의 본질식별자인 상품번호를 식별자로 활용할 수 없습니다. 주문상세 테이블에서 상품번호가 중복되기 때문입니다. 이때 주문상세 모델은 상품번호를 식별자로 구성하지 않고 하나의 주문에 발생하는 중복상품의 COUNT를 주문순번이라는 인조식별자로 구분합니다.

 

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

인조식별자를 사용하면 데이터의 중복을 막을 수 없습니다. 기본키 제약을 활용한다면 중복 데이터를 원천차단할 수 있지만 기본키를 인위적으로 생성한 속성으로 정의한다면 차단이 불가능합니다.

 

-- 주문상세 : 주문상세번호, 주문번호, 상품번호, 상품명, 배송지)
INSERT INTO 주문상세 VALUES(주문상세번호SEQ.NEXTVAL, 110001, 1234, '제주감귤1box', '우리집')
INSERT INTO 주문상세 VALUES(주문상세번호SEQ.NEXTVAL, 110001, 1234, '제주감귤1box', '우리집')
INSERT INTO 주문상세 VALUES(주문상세번호SEQ.NEXTVAL, 110001, 1234, '제주감귤1box', '부모님집')
INSERT INTO 주문상세 VALUES(주문상세번호SEQ.NEXTVAL, 110001, 1234, '제주감귤1box', '친구집')

 

주문상세번호는 시퀀스 객체로 인해 중복되지 않으므로 나머지 속성값이 모두 같더라도 중복데이터가 아닙니다. 본질식별자의 경우 기본키 제약조건에 의해 에럴가발생하므로 데이터 중복을 막을 수 있습니다.

 

INSERT INTO 주문상품 VALUES(110001, 1, 1234, '제주감귤1box', '우리집')
INSERT INTO 주문상품 VALUES(110001, 1, 1234, '제주감귤1box', '우리집')
INSERT INTO 주문상품 VALUES(110001, 2, 1234, '제주감귤1box', '부모님집')
INSERT INTO 주문상품 VALUES(110001, 3, 1234, '제주감귤1box', '친구집')

 

중복 데이터 문제를 해결하기 위해 최대한 본질식별자를 사용해야 합니다. 불가피하게 인조식별자를 사용했다면 애플리케이션에서 이를 방어하는 로직이 추가되어야 합니다.

 

불필요한 인덱스의 생성

 

-- 본질식별자 (주문번호) 일때의 엑세스 패턴
SELECT *
FROM 주문상품
WHERE 주문번호 = :B1;

-- 인조식별자(주문번호+ 상품번호) 일때의 액세스 패턴
SELECT *
FROM 주문상품
WHERE 주문번호 = :B1
AND 상품번호 = :B2;

 

가장 기본적인 액세스 패턴입니다. 본질식별자를 구성하면 PK인덱스를 활용할 수 있지만 인조식별자로 구성하면 인덱스를 추가로 생성해줘야 합니다. 인조식별자를 사용하면 불필요한 인덱스를 추가로 생성해야 합니다. 추가인덱스는 용량과 DML 성능에 영향을 줍니다. 식별자의 속성이 많아지는 경우 본질식별자와 인조식별자의 장단점을 따져보고 사용해야 합니다. 인조식별자의 남용을 피하고 필요한 경우에만 사용하는 것이 바람직합니다.

반응형