원숭이 엉덩이는 빨개, 빨가면 사과, 사과는 맛있어
우리는 익숙하게 사물과 사물을 연관지어서 생각할 수 있어, 관계형 데이터베이스(RDBMS)를 자연스럽게 받아들인다. 마치 객체지향을 공부할 때, 우리가 사는 세계와 비유하는 것을 자연스럽게 받아들이는 것처럼
그럼 관계형 데이터베이스에서, 두 테이블의 관계가 다대다(M:N)일 때, 이것을 일대다(1:N), 다대일(M:1)로 만들어주는 이유가 뭘까?
자, 다대다(M:N)가 되는 상황부터 살펴보자!
우리는 각 게시글마다 댓글을 등록한 회원들을 알고싶다.
하나의 게시글에는 여러 명의 회원이 댓글을 등록할 수 있고, 한 명의 회원 또한 여러 개의 게시글에 댓글 등록이 가능하다. 이러한 관계는 다대다가 될 수 있다.
다대다의 관계로 테이블을 구성을 어떻게 하면 될까? 방법과 이 때의 단점을 하나씩 살펴보자!
(회원 테이블과 게시글 테이블의 PK를 구분하기 위해 PK 값을 M/P+숫자 형식으로 지정했다. 또한, 방법을 나타낼 때 게시글 테이블만 예시로 나타냈다. )
회원 테이블
| PK | 이름 |
|------|-------------|
| M01 | 데이터마스터 |
| M02 | 자바러버 |
| M03 | 파이썬팬 |
| M04 | 웹왕 |
게시글 테이블
| PK | 제목 |
|------|--------------|
| P01 | 데이터베이스 소개 |
| P02 | 자바 고급 |
| P03 | 파이썬 기초 |
| P04 | 웹 개발 입문 |
방법 1) 하나의 컬럼에, 연관된 FK의 값을 모두 저장한다.
| PK | 제목 | FK_회원 |
|------|--------------|--------------------|
| P01 | 데이터베이스 소개 | M01 |
| P02 | 자바 고급 | M02 |
| P03 | 파이썬 기초 | M01, M03 |
| P04 | 웹 개발 입문 | M02, M04 |
엔터티 내의 모든 속성은 반드시 단 하나의 값을 가져야 한다는 도메인 원자성이 지켜지지 않는다.
방법 2) 연관된 FK의 개수만큼 컬럼을 늘린다.
| PK | 제목 | FK_회원1 | FK_회원2 |
|------|--------------|---------|---------|
| P01 | 데이터베이스 소개 | M01 | NULL |
| P02 | 자바 고급 | M02 | NULL |
| P03 | 파이썬 기초 | M01 | M03 |
| P04 | 웹 개발 입문 | M02 | M04 |
연관된 수에 따라 여러 개의 FK_회원 컬럼을 추가해야한다. 연관이 없는 레코드는 null이나, 다른 초기값으로 비어있음을 저장해둬야하기 때문에, 저장 공간을 낭비하게 되고 쿼리문이 복잡해진다.
또한 속할 수 있는 학생의 수에 따라 테이블 구조가 변경될 수 있어 불안전한 구조를 가진다.
방법 3) 관계가 추가될 때, 참조하는 FK에 따라 레코드를 추가한다.
| PK | 제목 | FK_회원 |
|-------|--------------|-------|
| P01 | 데이터베이스 소개 | M01 |
| P02 | 데이터베이스 소개 | M03 |
| P03 | 자바 고급 | M02 |
| P04 | 자바 고급 | M04 |
| P05 | 파이썬 기초 | M01 |
| P06 | 파이썬 기초 | M03 |
| P07 | 웹 개발 입문 | M02 |
| P08 | 웹 개발 입문 | M04 |
데이터가 중복된다. 데이터 연관된 데이터를 수정한다도 해도 다른 곳에서 참조하고 있는 데이터가 이러한 수정 사항을 반영하지 못하여 데이터 무결성이 깨지게 된다.
3가지 방법을 통해서 본 단점
- 도메인 원자성을 지키지 못함
- 저장 공간 낭비
- 쿼리의 복잡성 증가
- 불안전한 테이블 구조를 갖게 됨
- 데이터 중복 문제로 인한 무결성 X 일관성 X
이러한 단점을 보완하기 위해 아래와 같이 중간 테이블 두어, 각 테이블에서 중간테이블을 보았을 때 각각 1:N, 1:M이 되도록 한다.
| FK_게시글 | FK_회원 |
|-----------|---------|
| P01 | M01 |
| P01 | M03 |
| P02 | M02 |
| P02 | M04 |
| P03 | M01 |
| P03 | M03 |
| P04 | M02 |
| P04 | M04 |
다대다(M:N) 관계를 1:N, 1:M으로 풀어줌으로써, 다대다 관계에서 발생할 수 있는 단점들을 피할 수 있다.
추가로, 특정 회원이 등록한 댓글이 어느 게시글인지 하나의 테이블을 통해 바로 확인 할 수 있다는 장점이 있다.
만일, 중간테이블이 없었다면 회원관점에서의 기능임에도 불구하고, 회원 테이블이 아닌, 게시글 테이블에서 참조하고 있는 회원값(회원 PK)을 조회하여 찾아내야하는 경우가 있을 수도 있다.
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 트랜잭션(Transaction) 격리수준 (1) | 2024.07.04 |
---|