[DATABASE] 식별과 비식별 관계

JungChihoon·2020년 7월 18일
23

Database

목록 보기
5/5

ERD를 작성하다보니 테이블간의 관계를 설정할 때 두 테이블의 관계가 식별관계인지 비식별관계인지 판단함에 어려움을 겪었다. 찾아본 여러 참조문서를 종합해 정리해놔야겠다.

우선 앞에 내가 앞에 작성했던 기본키(PK)와 외래키(FK)에 대한 글을 다시 한번 읽어 보았다.
https://velog.io/@jch9537/DATABASE-PK-FK
기본키는 테이블의 하나의 행의 여러 정보들 중 이를 식별해 낼 수 있는 정보를 말하며 외래키는 테이블간의 관계(참조하는 테이블과 참조되는 테이블 간의 관계)를 나타내는 정보를 말한다.

여기서 외래키를 사용하여 참조하고 참조되는 두 테이블간의 관계에 따라 식별관계와 비식별관계로 나눌 수 있다.
우선 식별관계를 살펴보자.

상품과 주문의 다대다 관계의 두 테이블이 있다. 상품 테이블에서는 상품번호가 기본키이고 주문테이블은 주문번호가 기본키이다.
이제 앞에 작성했던 블로그에서 처럼 상품과 주문테이블 사이에 하나의 테이블을 만들어 일대다 관계로 연결해보자.

위의 그림에서 처럼 주문_상품 테이블을 만들어 일대다 관계로 만들어 주었다.

상품테이블과 주문테이블의 기본키인 상품번호와 주문번호가 주문상품 테이블의 외래키가 되었다. 그리고 이 두 외래키는 주문상품테이블의 정보를 식별할 수 있는 기본키(2개이상의 컬럼도 기본키로 구성될 수 있다.)의 역할도 하게된다. 이러한 관계를 식별관계라고한다.

식별관계에 대해 정리를 해보자면

  • 부모테이블(상품, 주문테이블) 기본키(PK)가 자식 테이블(주문_상품)의 외래키이자 기본키로 사용되는 관계이다.
  • 자식 테이블의 행(정보)를 추가할 때 부모테이블의 참조 행(상품번호 또는 주문번호)이 없다면 자식테이블의 행을 추가 할 수 없다.
    : 주문_상품테이블은 상품번호와 주문번호 중 하나라도 없다면 기본키를 만들 수 없게 되고(두개의 외래키가 합쳐 기본키가 되므로) 기본키가 없어 정보를 식별할 수 없으므로 데이터를 넣을 수 없다.
    : 예를 들면 게시판의 작성글과 댓글의 관계를 식별관계라고 할 수 있다.(작성글이 없다면 댓글도 없다)

로 볼 수 있으며 식별관계는 실선으로 나타내 준다.

비식별관계는 부모 테이블을 참조한 테이블에서 참조된 외래키가 기본키가 아닌 일반속성(컬럼)으로 참조되었을 때를 말한다.
위의 그림의 주문_상품테이블에 정보를 식별할 수 있는 기본키를 추가하면 다음과 같다.

주문상품번호라는 기본키를 추가하였다.
주문
상품번호로 주문_상품테이블의 정보들을 식별할 수 있게 되고 외래키(상품번호와 주문번호)는 테이블의 일반속성이 되었다.

비식별관계에 대해 정리하면

  • 부모 테이블(상품, 주문테이블) 기본키가 자식 테이블(주문_상품테이블)의 일반컬럼이나 외래키(Foreign Key) 컬럼에 저장되는 관계이다.
  • 자식 테이블의 행(정보)를 추가할 때 부모테이블의 참조 행(상품번호 또는 주문번호)이 없어도 자식테이블의 행을 추가 할 수가 있다.
    : 예를 들면 회사의 부서와 사원의 관계를 비식별관계라고 할 수 있다. (사원이 부서가 배정되지 않을 수도 있으므로)

로 정리될 수 있으며 비식별관계는 점선으로 표시한다.

이렇게 식별과 비식별의 관계에 대해 정리해 보았다.
앞의 설명과 같이 하나의 관계를 다르게 표현함에 따라 식별 또는 비식별로 다르게 관계가 표현이 되니 매우 헷갈릴 수 있을 것 같다.
여기서 하나 참고할 부분에 대해 말하자면 위의 그림에서 비식별관계는 주문상품번호라는 기본키를 임의로 추가하여 만들었다. 이렇게 추가한 키를 인조키라고 하는데 기본키를 인조키로 설정하는 것이 권장된다.
이유는 식별관계를 나타내는 그림에서 보면 상품번호와 주문번호 두개의 키가 주문
상품테이블의 기본키로 되어있다. 기본키는 최대한 변하지 않는 값이어야하는데 어떤이유에서 상품번호 또는 주문번호가 변경이 된다던지 사용을 할 수 없게 된다면 데이터 구조를 다시 만들어야하는 경우가 발생하기 때문이다.
인조키와 자연키에 대한 부분은 아래의 참조문서를 참고하면 좋겠다.
자연키와 인조키

간단하게 이해가 됐다면 다음의 참조문서로 좀 더 깊이 식별과 비식별의 관계, 그리고 관계를 선택할때 고려해야할 점에 대해 알아보면 매우 좋다.

참조

profile
주니어 개발자

1개의 댓글

comment-user-thumbnail
2023년 1월 25일

정리해주신 글 잘봤습니다. 식별-비식별 관계에 대해 헷갈렸는데 덕분에 정리됩니다. 식별관계(실선)인 경우, 부모 테이블의 PK를 FK이자, PK로 사용되는 경우고 비식별관계(점선)인 경우는 부모테이블의 PK가 자식테이블의 FK로 사용되는 경우.. 감사합니다.

답글 달기