INSERT INTO 주문상세 VALUES ( 주문상세번호.SEQ.NEXTVAL, 110001, 1234, '귤 1 BOX', '우리집' )
DBMS 에서 중요한 식별자는 엔터티에서 데이터를 식별할 수 있는 속성이다.
이처럼, 식별자는 대체여부에 따라 본질식별자 그리고 인조 식별자로 나뉘어질 수 있다.
* 본질 식별자 ; 업무에 의해 만들어진 식별자
* 인조 식별자 : 업무적으로는 만들어지진 않지만 본질식별자가 복잡한 구성을 갖고 있으므로 인위적으로 만든 식별자.
해당 주문 상세 테이블에 대한 식별자는 이제 주문상세 번호이다. 해당 주문 상세 번호는 이제 필요한 해당 단일 식별자로 구성된 키값이기 때문에 시퀀스 객체로 해결이 가능하다
다음은 시퀀스 객체로 구현된 SQL 이다.
INSERT INTO 주문상세 VALUES ( 주문상세번호.SEQ.NEXTVAL, 110001, 1234, '귤 1 BOX', '우리집' )
INSERT INTO 주문상세 VALUES ( 주문상세번호.SEQ.NEXTVAL, 110001, 1234, '귤 1 BOX', '부모집' )
INSERT INTO 주문상세 VALUES ( 주문상세번호.SEQ.NEXTVAL, 110001, 1234, '귤 1 BOX', '친구집' )
이렇게 삽입이 된다면 해당 필요한 값들이 아래와 같이 생성이 되었을 것이다 .
하지만 이럴 경우 외부 식별자를 사용하는 방식의 문제인 두 가지 방법의 문제점이 있다.
- 중복 데이터로 인한 품질
- 불필요한 인덱스 생성
1. 중복데이터로 인한 품질 문제
우선 첫번째 케이스에 대해서 먼저 살펴보자.평소에는 그렇게 많은 문제가 생기지 않지만 Insert 문의 로직 오류로 중복해서 해당 문제가 발생했다고 생각해보자.
INSERT INTO 주문상세 VALUES ( 주문상세번호.SEQ.NEXTVAL, 110001, 1234, '귤 1 BOX', '우리집' )
이럴 경우에는 인조식별자를 사용했기 때문에, 아무 constraint 나 막음 없이 잘들어가게 된다.
하지만 주문상세 번호가 식별자가 아니라 주문번호 + 주문순번이 식별자였을 경우에는 본질식별자이기 때문에 기본키 제약조건에 의해 위의 저 Insert 문 오류가 실행안될 것이다.
2. 불필요한 인덱스 생성
불필요한 인덱스 생성도 비슷한 맥락이다.
주문상세 번호가 식별자인 테이블 vs 주문 번호 + 상품번호가 식별자인 테이블을 살펴보자
SELECT *
FROM 주문상품
WHERE 주문번호 = :B1
AND 상품번호 = :B2
첫번째 케이스는, 인조 식별자로 주문번호와 상품번호를 찾을 때 반드시 pk 로 찾지 못하고 주문번호+상품번호로 구성된 새로운 인덱스가 생성되어 저 sql 문을 실행시키게 된다.
두번째 케이스는, 이미 주문번호 + 상품번호가 pk 이기 때문에 새로운 인덱스를 생성할 필요 없이 sql 문이 실행된다.
결론
인조식별자를 사용했을 때 장단점이 다르지만, 무조건 사용하지 않는 것이 아니라 남용을 필요하고 꼭 필요할 때 쓰자~
'이유's Programming > DBMS' 카테고리의 다른 글
SQL 연산자 (0) | 2021.03.23 |
---|---|
[ 3 -1 ] DBMS 내장 함수 (0) | 2021.03.19 |
[ 2 -1 ] 관계와 조인의 이해 (0) | 2021.03.16 |
2-2. 정규화 ( 제 3 정규형, 반정규화와 성능 ) (0) | 2021.03.15 |
2-1. 정규화 ( 제 1 정규형, 제 2 정규형 ) (0) | 2021.03.08 |