ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 식별자
    데이터베이스 2021. 5. 2. 16:26

    주식별자의 특징

    -유일성, 최소성, 불변성, 존재성

     

    식별자 분류

    분류 식별자 내용
    대표성
    여부
    주식별자 엔티티 내 각 어커런스를 구분할 수 있는 구분자. 참조관계 연결할 수 있는 식별자
    보조식별자 엔티티내 각 어커런스를 구분할 수 있으나, 대표성을 가지지 못해 참조성을 연결할 수 없다.
    스스로 생성
    여부
    내부식별자 엔티티 내부에서 스스로 생성되는 식별자
    외부식별자 타 엔티티와의 관계를 통해 타 엔티티에서 받아오는 식별자
    속성 수 단일식별자 하나의 속성으로 구성된 식별자
    복합식별자 둘 이상의 속성으로 구성된 식별자
    대체
    여부
    본질(원조)
    식별자
    업무에 의해 만들어 지는 식별자
    인조식별자 원조식별자가 복잡한 구성을 갖고 있어 인위적으로 만든 식별자

     

    주식별자 도출기준

    1. 업무에서 자주 이용되는 속성을 주식별자로 지정

     직원 엔티티에서 유일한 속성은 주민번호와 사원번호가 있을 때, 사원번호를 주식별자, 주민번호를 보조식별자로 한다.

     

    2. 명칭, 내역 등과 같이 이름으로 기술되는 것은 피함

     한 회사에 부서가 100개 있을 때, 부서 이름이 유일하게 구분된다고 해 주식별자로 지정하게 되면, 

    테이블을 읽을 때 항상 where 조건절에 부서이름이 들어가야한다. 이름이 길어질 경우 정확하게 기술하는데 어려움도 있다. 명칭이나 이름 외의 식별자가 없으면 일련번호, 코드와 같은 식별자를 생성한다.

     

    3. 속성의 수가 많아지지 않게 한다.

     주 식별자로 선정된 속성들이 자신의 자식 엔티티로붙 손자, 증손자 엔티티까지 상속이 되고 조인으로 인한 성능 저하가 걱정된다면 속성의 반정규화 측면에서 하나의 테이블에 맣은 속성이 인정될 수도 있다.

    하지만 일반적인 경우 주식별자의 속성의 개수가 많으면 새로운 인조 식별자를 생성해 데이터 모델을 구성하는 것이 더 모델과 개발을 더 단순하게 할 수 있다.

     

    주식별자-복합속성

     

    식별자관계와 비식별자 관계

    자식 엔티티에서 부모 엔티티에서 받은 외부식별자를 주식별자로(PK) 사용할 것인지, 부모와 연결이 되는 속성으로만(FK) 사용할 것인지를 결정해야한다.

     

    식별자관계

    부모엔티티의 식별자를 자식 엔티티의 PK 로 사용하는 경우 NULL 이 오면 안되므로 반드시 부모엔티티가 생성되어야 자신의 엔티티가 생성되는 경우이다. 부모로 받은 속성을 자식이 모두 사용하고 그것만으로 주식별자를 사용한다면 부모와 자식의 엔티티 관계는 1:1 이 된다. 만약 다른 여러 부모 엔티티로부터도 속성을 받거나 자신의 속성을 따로 두고 함께 주식별자로 이용한다면 그 관계는 1:M 이 된다.

    사원과 임시직사원의 관계는 1:1로, 주식별자가 동일하며 엔티티 통합의 대상이 될 수 있다.

    이렇게 자식엔티티의 주식별자로 부모의 주식별자를 사용하는 경우를 식별자 관계라고 한다.

     

    비식별자관계

    부모엔티티의 주식별자를 일반 속성으로만 사용하는 경우이다.

    아래 네가지 경우에 비식별자관계에 의한 외부 속성을 생성한다.

     

    1.자식 엔티티에서 받은 속상이 반드시 필수가 아니여도 무방하다. 부모 없는 자식이 생성 될 수 있다.

    2.엔티티별로 데이터 생명주기를 다르게 관리할 경우이다.

    3.여러 개의 엔티티가 하나의 엔티티로 통합되었는데 각각의 엔티티가 별도의 관계를 가질 때이다.

     

     

    식별자 관계로만 설정할 때 문제점

    지속적으로 식별자 관계를 연결한 데이터 모델의 PK 속성의 수는 데이터 모델의 흐름이 길어질수록 증가할 수밖에 없다.

     

     

    비식별자 관계로만 설정할 때 문제점

    주민번호, 사원번호,주문번호,목록번호 등 부모 엔티티의 PK 이지만 자식엔티티의 데이터를 조회할 때도 필요한 속성일 때, 비식별자 관계로 설정하면 자식엔티티를 조회할 때 불필요한 조인을 사용하며 부모 엔티티를 찾아가야한다.

    이는 SQL 구문이 길어지고 성능이 저하되는 문제를 야기한다.

     

    식별자관계와 비식별자관계 모델링

    관계를 분석해서 관계가 약하고, 독립 PK 가 필요하고, PK 속성을 단순화하는게 낫다면 비식별자로 설정하는 것을 고려해도 좋다.

    항목 식별자관계 비식별자관계
    목적 강한 연결관계 표현 약한 연결관계 표현
    자식 주식별자 영향 자식 주식별자의 구성에 포함 자식 일반속성 포함
    표기법 실선 점선
    연결 고려사항 -반드시 부모 엔티티 종속
    -자식 주식별자 구성에 부모 주식별자 포함 
    -상속받은 주식별자속성을 타 엔티티에 이전 필요
    -약한 종속 관계
    -자식 주식별자 독립적 구성
    -자식 주식별자 구성에 부모 주식별자 부분 필요
    -상속받은 주식별자속성을 타 엔티티에 차단 필요
    -부모쪽의 관계 참여가 선택관계

    본질식별자 VS 인조식별자

     

    아래 주문과 주문상세의 테이블이다.

    주문상세에서 주문번호와 주문순번이 함께 PK 로 있는 본질식별자를 사용한 모델이다.

    본질식별자 사용

    아래는 주문상세테이블에 주문상세번호라는 인조식별자를 만들어 PK 로 만든 모델이다.

     

    인조식별자 사용

    인조식별자는 원조식별자가 복잡한 구성을 갖고 있는 경우 인위적으로 만들어 사용하는 식별자로 개발 편의성을 증대시켜준다. 

    하지만 아래와 같은 문제점도 야기한다.

     

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

    기본키 제약을 활용하면 중복 데이터를 원천 차단 할 수 있지만, 외부 식별자를 사용하면 중복 데이터를 막을 수 없다. 

    만약 귤이라는 상품 한가지를 우리집, 부모집, 친구집이라는 여러 배송지에 주문을 한 번에 하게 될 경우, 

    INSERT 문을 생성하는 로직에 오류가 있어 아래와 같이 우리집에 올 귤이 2번 insert 가 될 경우, 

    주문상세번호는 NEXTVAL 로 다르게 생성되기 때문에 이 주문이 중복된 주문이라는 것을 알아챌 수 없다. 

    			 //PK, 주문번호, 상품번호, 상품명,배송지
    insert into 주문상세 values(주문상세번호SEQ.NEXTVAL,1001,1234,'귤 5KG','우리집');
    insert into 주문상세 values(주문상세번호SEQ.NEXTVAL,1001,1234,'귤 5KG','우리집');
    insert into 주문상세 values(주문상세번호SEQ.NEXTVAL,1001,1234,'귤 5KG','부모집');
    insert into 주문상세 values(주문상세번호SEQ.NEXTVAL,1001,1234,'귤 5KG','친구집');

    만약 본질식별자를 이용한다면 이 같은 문제를 DBMS 에서 본질적으로 차단하게 된다.

    만약 외부식별자를 이용하게 되면 애플리케이션에서 이를 방지하는 코드를 추가해야한다.

     

    2.불필요한 인덱스 생성 

     

    주문상품 데이터에 접근한다고 가정하면, 가장 기본적인 패턴은 아래와 같다.

    select * from 주문상품 where 주문번호 = ?;
    
    select * from 주문상품 where 주문번호 = ? and 상품번호 = ?;

    where 절 뒤에 오는 조건들은 인덱스가 생성되는데 

    본질식별자일때는 주문번호 + 상품번호 로 한 개의 인덱스가 생성되는 반면, 

    인조식별자에는 주문상품번호 , 주문번호 + 상품번호 로 두 개의 인덱스가 생성된다.

     

    추가로 생성된 인덱스는 용량과 DML 성능에 영향을 줄 수 있다.

    인조식별자를 사용할 때의 장단점에 대해 잘 인지하고, 인조식별자의 남용을 피해, 꼭 필요한 경우에 사용할 수 있도록 해야한다.

     

     


    출처 

    SQL 전문가 가이드 - 한국데이터산업진흥원

     

    반응형

    '데이터베이스' 카테고리의 다른 글

    조인  (0) 2021.05.08
    단일함수, 집계함수  (0) 2021.05.05
    정규화  (0) 2021.05.03
    엔티티, 속성,관계  (0) 2021.05.02
    데이터 모델링  (0) 2021.05.01
Designed by Tistory.