공부노트/DB

[Database] 외래키(Foreign Key)의 사용 - 식별관계, 비식별관계

Reload0213 2022. 1. 6. 17:14

1. 외래키(Foreign Key)

상품테이블과 주문테이블이 있다고 생각해보자.

 

 

아직 두 테이블간의 관계는 정해지지않은 상태다. 두 테이블의 관계는 어떻게 될지 생각해보자.

하나의 상품은 여러 주문에서 구매할 수 있고(재고만있다면..), 하나의 주문은 여러 상품을 구매할 수 있다. 다대다(N:M) 관계라는 뜻이다.

 

 

ERD상으로는 이렇게 그릴 수 있지만 보통 RDB에서 다대다 관계는 중간에 관계 테이블을 추가해서 사용한다.

 

주문_상품이라는 관계 테이블을 추가했다(주문 테이블이 너무 허전해서 아무렇지않은듯 속성도 추가했다.). 주문_상품 테이블은 각각 상품 테이블과 일대다, 주문 테이블과 다대일 관계를 갖고있다. 주문_상품이 없는 상품은 존재할 수 있지만 주문_상품이 없는 주문은 존재할 수 없음도 ERD에 표현하고자 노력했으니 혹시 ERD가 틀린게 있으면 지적해주기바란다.

 

주문_상품 테이블은 관계 테이블로서 주문번호와 상품번호를 갖고있다. 상품번호와 주문번호는 각각의 테이블에서는 기본키였지만 주문_상품 테이블에서는 관계를 찾아가기위한 참조키로서 외래키(Foreign Key)라고 부른다.

 

2. 식별관계(Identifying Relationship)

식별 관계란, 부모 테이블의 기본키 또는 유니크 키를 자식 테이블이 자신의 기본키로 사용하는 관계입니다. 부모 테이블의 키가 자신의 기본키에 포함되기 때문에 반드시 부모 테이블에 데이터가 존재해야 자식 테이블에 데이터를 입력할 수 있습니다. 즉, 부모 데이터가 없다면 자식 데이터는 생길 수 없습니다.

식별관계는 ERD상에서 실선으로 표시합니다. 자식 테이블에 데이터가 존재한다면 부모 데이터가 반드시 존재하는 상태가 됩니다. 바퀴는 자동차 테이블에 데이터가 존재해야 생성할 수 있습니다. 즉, 부모 테이블에 자식 테이블이 종속됩니다.

관계 테이블이라고해서 뭔가 특별한게 아니다. 위에있는 주문 테이블을 보면 속성중에 회원ID가 존재한다. 회원ID는 ERD상에는 나타나지않은 회원 테이블의 기본키이며, 주문테이블이 외래키로 갖고있는 것이다. 즉 주문 테이블도 회원과의 관계를 이미 지니고있는것이다.

 

주문-상품예시1

하고싶은말은 주문_상품 테이블도 테이블이니 기본키가 필요하다는 것이다. 잘 생각해보자, 어떤 키가 주문_상품 테이블의 고유한 데이터를 찾을 수 있는 기본키가 될 수 있을까?

주문_상품 테이블은 특정 주문이 구매한 상품의 수만큼 로우가 쌓일것이다. 주문번호 1001 주문이 상품번호 1001, 1002 두개의 상품을 구매하면 주문_상품 테이블에도 2개의 로우가 추가될 것이다. 그리고 주문번호 1002 주문이 1002 상품 1개만 구매하면 1개의 로우가 추가될 것이다.

주문번호도 중복될 수 있고 상품번호도 중복될 수 있으니 단독으로는 기본키가 될 수없다. 하지만 2개를 합쳐서 본다면? 주문번호와 상품번호를 둘다 합친 '하나의 주문 하나의 상품' 자체를 기본키로 본다면 주문이 중복될수는 없으므로 고유하다고 볼 수 있다.

여기선 따로 설명하지않지만 기본키는 2개 이상의 컬럼으로 구성되는것도 가능하고, 외래키가 기본키가 되는것도 충분히 가능하다.

이렇게 외래키를 기본키로 사용하는 관계를 식별 관계(Identifying Relationship)이라고 한다.

 

3. 비식별관계(Non Identifying Relationship)

비 식별 관계란 부모 테이블의 기본키 또는 유니크 키를 자신의 기본키로 사용하지 않고, 외래 키로 사용하는 관계입니다. 자식 데이터는 부모 데이터가 없어도 독립적으로 생성될 수 있습니다. 부모와의 의존성을 줄일 수 있기 때문에 조금 더 자유로운 데이터 생성과 수정이 가능합니다.

 

위에서 알아본 관계(주문 상품 예시1)는 하나의 주문에서 같은 상품을 2개 이상 사는 경우는 고려하지않았다. 만약 주문번호 1001 주문에서 상품번호 1001, 1001, 1002 상품을 구매한다면 주문번호와 상품번호로 기본키를 구성할 수 없게 된다.(물론 실제 비즈니스에서는 상품개수라는 속성을 추가해서 개수로 관리하지 저렇게 중복된 데이터를 그대로 넣지는 않을 것이다.)

주문-상품 예시2

 

외래키들을 기본키로 사용하지않고 일반 속성으로 취급하는 관계를 비식별관계라고 표현한다. 눈매가 예리한 사람들은 느꼈겠지만 ERD에서 비식별 관계는 관계를 점선으로 표시한다.

이러한 특성을 이해하였다면 추후 비즈니스 모델 변경에도 영향을 최소화하기위해 이런 관계 테이블에도 식별 관계보다는 인조키를 이용한 비식별 관계를 권장한다고 한다.

 

장단점


식별 관계의 장점

  • 데이터의 정합성 유지를 DB에서 한번 더 할 수 있다
  • 자식 테이블에 데이터가 존재한다면 부모 데이터도 반드시 존재한다고 보장할 수 있다

식별 관계의 단점

  • 요구사항이 변경되었을 경우 구조 변경이 어렵다

비식별 관계의 장점

  • 변경되는 요구사항을 유동적으로 수용할 수 있다
  • 부모 데이터와 독립적인 자식 데이터를 생성할 수 있다

비식별 관계의 단점

  • 데이터 정합성을 지키기 위해서는 별도의 비즈니스 로직이 필요하다.
  • 자식 데이터가 존재해도 부모 데이터가 존재하지 않을 수 있다
  • 즉, 데이터 무결성을 보장하지 않는다

'공부노트 > DB' 카테고리의 다른 글

[DB] ROUND : 숫자 반올림하기  (0) 2022.02.03
[DATABASE] 기본키(PK), 외래키(FK)  (0) 2022.01.06
[DataBase]CRUD가 도대체 뭐야?  (0) 2021.12.29