티스토리 뷰

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' 카테고리의 다른 글

기본키는 무엇으로 할까 - 자연키, 인조키  (4) 2017.06.25
MySQL ROLLUP  (0) 2017.01.24
쿼리 캐싱 방지  (0) 2017.01.12
mysql 실행계획 2  (0) 2017.01.10
서브 쿼리의 종류  (0) 2017.01.01
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함