DataBase에서 관계는 설계자가 객체를 바라보는 관점에 초점을 두게 됩니다.
DB를 정확하게 설계하기 위해서는 엔티티간의 관계를 명확하게 설정을 해야 할 것입니다. 또한 개발자의 관점 또는 객체의 성질, 프로젝트의 목적에 따라 관계는 달라질 수 있습니다. 최대한 정답에 근접하게 관계를 설정하기 위해서는 기본적인 1:1, 1:N, N:M 관계의 개념을 이해할 필요가 있을것 입니다.
양측 엔티티에서 서로 상대 엔티티를 바라볼 때 반드시 단 하나씩의 관계를 가지는것을 뜻합니다.
예시1) 한 사원은 하나의 차량만을 회사 주차장에 등록해야 한다.
이때 사원과 차량의 관계는 1:1 입니다.
예시2) 국가 - 수도 , 부서-부서장 등등...
국가-수도 관계에서 1:1 관계의 예외사항이 존재하기도 합니다. 예를들어 남아공 같은 경우는 행정수도: 프리토리아 , 입법수도: 케이프 타운, 사법수도: 블룸폰테인과 같이 3개의 수도를 갖고 있게 되는데, 일반적으로 수도는 높은확률로 한개만 존재하기 때문에 국가-수도 관계는 1:1 관계로 설정할 수 있습니다.
양측 엔티티에서 부모 엔티티는 자식 엔티티를 여러개 연결할 수 있으며, 자식 엔티티는 부모 엔티티 하나와 연결되는 관계입니다.
예시1) 사원들이 등록한 주차장을 예로 들어 주차장은 여러대의 차량과 연결되어 있지만 차량들은 하나의 주차장에만 소속된다.
이때 주차장과 차량의 관계는 1:N 관계가 형성됩니다. [주차장_1 : 차량_N]
** 일반적이지 않은 예시를 들려다 보니 명확하게 표현이 어려운점 죄송합니다..
> ERD 다이어그램 실선? 점선?
Ex) 게시판 댓글
회원 엔티티의 PK인 회원번호는 댓글 엔티티에서 FK이자 PK로 존재하기 때문에 실선(Identifying)으로 연결할 수 있습니다.
추가설명) 일반적으로 댓글 정보는 [댓글ID-작성자ID] 쌍을 이루게 됩니다. 만약 댓글ID만 기본키로 잡혀있다면 이 글의 작성자가 누구인지 검색해야 할 때 효율적이고 빠른 검색이 힘들 수 있습니다. 또한 댓글은 일반적으로 작성자에 의해서 쓰여지기 때문에 작성자의해 생성된다는 점 참고하시면 좋을것 같습니다.
Ex) 부서-사원 관계
부서와 사원의 관계는 1:N의 관계이며 부서엔티티의 PK는 사원엔티티에서 FK로 존재하고 있다. 이때 부서ID는 왜 사원엔티티에서 PK로 존재하는것이 아닌 일반속성으로 설정이 되어있는가?
"사원은 꼭 부서에 소속되어 있어야 하는것은 아니다."
사원은 꼭 부서에 소속되어 있어야 하는것은 아니다. 조금더 명확하게 들어가 보겠습니다. 일반적으로 신입사원이 회사에 입사를 했다고 가정할 때 사원은 바로 부서에 소속될 수 있지만 부서에 일정 기간 동안 소속되어 있지 않은 상태에서 사원 신분일 수 있습니다.
이때 사원이 부서에 소속되어 있지 않을 때 부서ID는 사원테이블에서 Null값을 가지게 되는데 기본키는 절대적으로 Null값을 가져서는 안된다.
즉, 개체무결성 원칙을 위반하게 되는 경우가 발생하므로 사원테이블에서 부서ID는 FK이자 일반속성으로 존재시키는것이 좋습니다.
N:M관계는 양측 엔티티 서로간의 관계가 1:N으로 맺어지는 관계입니다.
한번 예를 들어볼까요?
"학원은 여러 학생들이 존재합니다. 또한 학생도 여러 학원을 등록할수 있습니다."
어떠신가요? 한번 다른 예를 들어보겠습니다.
- 강의는 여러 학생들이 수강 합니다. 또한 학생도 여러 강의를 수강할 수 있습니다.
- 쇼핑몰에서 회원은 여러 상품들을 주문할 수 있으며 한 상품 또한 여러 회원들이 주문할 수 있습니다.
이렇듯 N:M관계는 양측 엔티티가 쌍방향적으로 1:N관계를 갖는것을 확인할 수 있습니다.
Note!) N:M 관계를 테이블로 연결짓을 때는 각 테이블의 기본키를 외래키로 참조하는 매핑테이블이 탄생하게 됩니다.