티스토리 뷰

1. 외래키(Foreign Key)

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



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

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



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


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


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


2. 식별관계(Identifying Relationship)

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


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

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

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



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

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


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

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


이럴땐 어떻게해야할까? 앞선 포스팅(기본키는 무엇으로 할까 - 자연키, 인조키)에서 살펴본 인조키를 이용하자.



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

기본키 포스팅에서도 말했지만 추후 비즈니스 모델 변경에도 영향을 최소화하기위해 이런 관계 테이블에도 식별 관계보다는 인조키를 이용한 비식별 관계를 권장한다.

'DataBase' 카테고리의 다른 글

외래키의 사용 - 식별관계, 비식별관계  (7) 2017.06.25
기본키는 무엇으로 할까 - 자연키, 인조키  (2) 2017.06.25
MySQL ROLLUP  (0) 2017.01.24
쿼리 캐싱 방지  (0) 2017.01.12
mysql 실행계획 2  (0) 2017.01.10
서브 쿼리의 종류  (0) 2017.01.01
공유하기 링크
TAG
댓글
  • 프로필사진 악오 잘 봣어요~ 2017.07.03 21:50
  • 프로필사진 nam 안녕하세요~! 너무 잘 정리되어있어서 감사합니다! 한가지 질문 드리고싶은게 있는데요
    저렇게 테이블 생성과 기본키, 외래키 설정 후에 1001번 주문번호에 1001,1002번상품 등록 그리고 1002번 주문번호에 1001번상품등록
    이렇게 주문_상품 테이블에 row를 쌓는다고 하셨는데 정말 죄송하지만 실행 쿼리좀 알려주실수 있나요ㅜㅜ?
    개념이 헷갈려서 updqte , insert 등 어떻게 사용해야할지 감이 안잡힙니다ㅜㅜㅜ 부탁드릴게요ㅜㅜㅜ
    2018.02.21 16:34
  • 프로필사진 LichKing 안녕하세요.
    쿼리를 알려달라는게 무슨말씀인지 모르겠네요..
    2018.03.04 12:55 신고
  • 프로필사진 1 잘 봤습니다^^ 2018.06.27 15:56
  • 프로필사진 123 제가 궁금해하던 부분을 알려주셨어요 감사합니다 ㅠㅠ 2019.05.25 20:19
  • 프로필사진 비즈니스가궁금 글 정리가 잘 되어있어서 도움이 되었습니다.
    비식별관계 설명에서 실제 비즈니스에서는 개수로 관리한다고 돼있는데 좀 더 자세하게 알려주실 수 있을까요?
    2019.12.10 11:50
  • 프로필사진 찐세 다른 프로젝트의 ERD를 보면서 공부를 하던중 조인테이블에 왜 전부 기본키를 새로 설정했는가 했더니 이런 이유가 있었군요 ㅠㅠ
    정말 좋은 정보 잘 배워갑니다. 감사합니다!ㅎㅎ
    2021.04.27 00:45 신고
댓글쓰기 폼