관계형 데이터베이스의 1:1, 1:N, N:M 관계

Gaeun·2022년 12월 13일
4

wecode TIL

목록 보기
2/24

관계형 데이터베이스

관계형 데이터베이스는 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.

관계형 데이터베이스에서 모든 데이터는 2차원 테이블로 표현할 수 있고, 각각의 테이블은 인스턴스(Row)와 속성(Column)으로 구성되어 있다.

관계?

관계형 데이터베이스에서 "관계"는 무슨 의미일까?

엔터티(테이블)과 엔터티와의 관계를 의미하며, 1:1(일대일), 1:N(일대다), N:M(다대다)의 세 가지 형식이 있다. 관계형 데이터베이스 내부의 테이블 A와 B는 무조건 세 가지 가운데 한 가지 관계에 해당한다.

1:1 관계 (일대일 관계)

1:1 관계란 테이블 A와 테이블 B의 Row(행)가 정확히 일대일 매칭이 되는 관계

ex)
국가 - 수도: 각 국가에는 정확히 하나의 수도가 있고, 각 수도는 정확히 한 국가의 수도이다.
배우자 - 배우자: 한 사람은 정확히 한 명의 배우자를 가진다.

1:N 관계 (일대다 관계)

1:N 관계는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미. 즉, 테이블 A의 한 개의 Row(행)가 테이블 B의 여러개의 Row(행)와 연결 되는 관계

현실 세계에는 1:N관계가 많이 있는데, 실제 DB를 설계할 때 자주 쓰이는 방식이다.

ex)
국가(1) - 도시(N): 일반적으로(도시 국가 제외) 한 국가에 여러 도시가 있으며, 각각의 도시는 한 국가에 속해있다.
부모(1) - 자식(N): 일반적으로 각 자식은 한 쌍의 부모가 있지만 각 부모는 여러 자녀를 가질 수 있다.
직원(N) - 관리자(1): 각 직원에게는 한 명의 직속 상사 또는 관리자가 있지만 일반적으로 각 관리자는 많은 직원을 감독한다.

⭐️N:M 관계 (다대다 관계)⭐️

(어제의 나를 굉장히 당황하게 만들었던 관계...)

N:M 관계는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계가 존재할 때 나타나는 모습. 즉, 서로가 서로를 1:N 관계로 보고 있다.

어떠한 설명을 봐도 명확하게 이해할 수 없어 구글링을 해보았고, 한 블로그의 글을 읽고 이해할 수 있었다.

두 개의 테이블이 서로의 행에 대해서 여러 개로 연관되어 있는 상태를 다대다 관계라고 하는데, 실생활에서 예를 들자면 한 명의 학생이 여러 수업을 수강하고, 한 수업은 여러 학생을 수용하는 경우를 생각해볼 수 있다.

(학생 테이블과 수업 테이블의 다대다 관계로 연결되어 있는 모습)

사실, 실무에서는 다대다 테이블을 사용하지 않는다. 관계형 데이터베이스는 정규화된 테이블의 집합이기 때문에 2개의 테이블로 다대다 관계를 표현할 수 없다. 따라서 각 테이블의 PK를 외래키(FK)로 참조하고 있는 연결 테이블(매핑 테이블)을 추가하여 일대다, 다대일의 관계로 풀어내야 한다.


(학생 테이블과 학생-수업 테이블이 일대다 관계이고, 학생-수업 테이블과 수업 테이블이 다대일 관계로 연관되어 있다.)

이를 이해하기 쉽게 numbers를 사용하여 데이터를 담고 있는 테이블들을 만들어보았다. 아래의 그림에서 뭉치는 국어, 수학, 영어 세 과목을 수강하고 있고, 수학 수업은 장미, 세모, 뭉치, 아름 4명의 학생을 수용하고 있다.

(급하게 만들다보니 typo가 있다. * table 이름의 student → students로 정정)

이렇게 다대다 관계를 일대다, 다대일의 두 테이블로 만들게 되면 데이터의 조회와 유지, 보수가 쉽다.

  • 코난이 듣는 수업을 알고 싶을 때에는 코난의 student id를 조건문으로 student_class 테이블을 조회하면 된다.
  • 만약 장미가 과학 수업을 듣게 된다면, 장미의 student id와 class id를 student_class 테이블에 삽입하면 된다.

TIP!

  1. 관계를 생각할 때 테이블을 기준으로 생각하지 않고, '한 행'을 기준으로 생각한다.
  2. 논리적으로 생각할 때에는 연결 테이블(매핑 테이블)을 생각하지 않는다.
  • 뭉치의 student id는 student_class에 여러 개 존재한다. (X)
  • 뭉치는 국어, 수학, 영어 수업을 수강한다. (O)
  1. 항상 일대다(1:N) 기준으로 생각한다. 다대일(N:1)보다 직관적으로 이해하기 쉽다.
  • 뭉치가 여러 수업을 수강한다. (O)
  • 수학 수업은 장미, 세모, 뭉치, 아름 4명의 학생을 수용하고 있다. (X)

참고 자료

profile
🌱 새싹 개발자의 고군분투 코딩 일기

0개의 댓글