관계형 데이터베이스는 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.
관계형 데이터베이스에서 모든 데이터는 2차원 테이블로 표현할 수 있고, 각각의 테이블은 인스턴스(Row)와 속성(Column)으로 구성되어 있다.
관계형 데이터베이스에서 "관계"는 무슨 의미일까?
엔터티(테이블)과 엔터티와의 관계를 의미하며, 1:1(일대일), 1:N(일대다), N:M(다대다)의 세 가지 형식이 있다. 관계형 데이터베이스 내부의 테이블 A와 B는 무조건 세 가지 가운데 한 가지 관계에 해당한다.
1:1 관계란 테이블 A와 테이블 B의 Row(행)가 정확히 일대일 매칭이 되는 관계
ex)
국가 - 수도: 각 국가에는 정확히 하나의 수도가 있고, 각 수도는 정확히 한 국가의 수도이다.
배우자 - 배우자: 한 사람은 정확히 한 명의 배우자를 가진다.
1:N 관계는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미. 즉, 테이블 A의 한 개의 Row(행)가 테이블 B의 여러개의 Row(행)와 연결 되는 관계
현실 세계에는 1:N관계가 많이 있는데, 실제 DB를 설계할 때 자주 쓰이는 방식이다.
ex)
국가(1) - 도시(N): 일반적으로(도시 국가 제외) 한 국가에 여러 도시가 있으며, 각각의 도시는 한 국가에 속해있다.
부모(1) - 자식(N): 일반적으로 각 자식은 한 쌍의 부모가 있지만 각 부모는 여러 자녀를 가질 수 있다.
직원(N) - 관리자(1): 각 직원에게는 한 명의 직속 상사 또는 관리자가 있지만 일반적으로 각 관리자는 많은 직원을 감독한다.
(어제의 나를 굉장히 당황하게 만들었던 관계...)
N:M 관계는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계가 존재할 때 나타나는 모습. 즉, 서로가 서로를 1:N 관계로 보고 있다.
어떠한 설명을 봐도 명확하게 이해할 수 없어 구글링을 해보았고, 한 블로그의 글을 읽고 이해할 수 있었다.
두 개의 테이블이 서로의 행에 대해서 여러 개로 연관되어 있는 상태를 다대다 관계라고 하는데, 실생활에서 예를 들자면 한 명의 학생이 여러 수업을 수강하고, 한 수업은 여러 학생을 수용하는 경우를 생각해볼 수 있다.
(학생 테이블과 수업 테이블의 다대다 관계로 연결되어 있는 모습)
사실, 실무에서는 다대다 테이블을 사용하지 않는다. 관계형 데이터베이스는 정규화된 테이블의 집합이기 때문에 2개의 테이블로 다대다 관계를 표현할 수 없다. 따라서 각 테이블의 PK를 외래키(FK)로 참조하고 있는 연결 테이블(매핑 테이블)을 추가하여 일대다, 다대일의 관계로 풀어내야 한다.
(학생 테이블과 학생-수업 테이블이 일대다 관계이고, 학생-수업 테이블과 수업 테이블이 다대일 관계로 연관되어 있다.)
이를 이해하기 쉽게 numbers를 사용하여 데이터를 담고 있는 테이블들을 만들어보았다. 아래의 그림에서 뭉치는 국어, 수학, 영어 세 과목을 수강하고 있고, 수학 수업은 장미, 세모, 뭉치, 아름 4명의 학생을 수용하고 있다.
(급하게 만들다보니 typo가 있다. * table 이름의 student → students로 정정)
이렇게 다대다 관계를 일대다, 다대일의 두 테이블로 만들게 되면 데이터의 조회와 유지, 보수가 쉽다.