Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- RESAPI
- 클린코드
- 자식객체
- 미니미프로젝트
- Be
- java
- 마이크로서비스디자인패턴
- 스프링으로하는마이크로서비스구축
- TDD
- 완벽이해
- G1GC
- Execution Engine
- 도커
- GC
- Spring/JAVA 서적
- Self Descript Message
- Java 22
- 트랜잭션 격리 수준
- KPT
- 부모객체
- ComponentScan
- hateoas
- testdrivendevelopment
- ATDD
- Runtime Area
- pair programming
- docker
- Solid
- M:N
- DB
Archives
- Today
- Total
Programming Summary
DB) M:N을 왜 사용하면 안되는가? 본문
1:1과 1:N과 M:N
1:1
1대 1 관계란 어느 엔티티 쪽에서 상대 엔티티와 반드시 단 하나의 관계를 가지는 것을 말한다.
예시) Student : Seat
왜 1대 1인가?
- 한 명의 학생이 한 개의 자리만 소유할 수 있고, 한 자리는 여러 명의 학생이 소유할 수 없기 때문.
1:N
1:N 관계는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미한다.
예시) Student : ProjectTeam
왜 1대 N인가?
- 팀도 별도의 테이블로 분리해야 하고, 하나의 팀에는 여러명의 Student가 속하고, 하나의 Student는 단 하나의 팀에만 속하기 때문.
N:M
N:M 관계는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계를 가지는 것을 말한다.
예시) Student : StudyGroup
왜 M대 N인가?
- 하나의 스터디 그룹에는 여러명이 속할 수 있고, 한 명의 Student는 여러 개의 스터디 그룹에 속할 수 있기 때문.
M대 N일 경우 어떻게 Foreign Key를 처리해야할까?
다음 그림을 보자.
만약 한명의 학생이 여러 StudyGroup에 속하기 위해 FK 컬럼만 다른 레코드를 새롭게 추가한다면, FK를 제외한 다른 데이터들이 중복으로 들어가게 되어 유지/보수가 어려워 진다.
그럼 다음과 같이 작성하면 어떨까?
하나의 학생 레코드에서 여러 StudyGroup FK를 갖도록 하기 위해 컬럼을 늘렸다. 딱 봐도 문제점이 많아 보인다. 먼저 비효율적인 null이 너무 많이 발생한다. 또한 속할 수 있는 StudyGroup의 수가 변경될 때마다 스키미가 변경되어야 한다. DB스키마를 조작하는 것은 그리 바람직한 행위가 아니고 어떤 문제가 추가로 발생할 지 모르므로 최대한 줄이는 것이 좋다.
이 외에도 한 컬럼에 값을 여러 개 저장하는 등의 방법을 쓸 수 있겠지만, 아마 만족스러운 답은 아닐 것이다.\
그렇기에 우리는 M대 N을 1대 N과 1대 M으로 나누고 중간에 서로를 연결해주는 중간 테이블을 두는 것이 가장 나은 방법이라고 할 수 있다.
'프로 디지털 아카데미 4기' 카테고리의 다른 글
Spring) 어디서 DTO를 Entity로 변환해야 하는가? (0) | 2024.07.22 |
---|---|
Server) Web Server와 WAS는 무슨 차이일까? (0) | 2024.07.16 |
JAVA) SOLID 원칙이란? (0) | 2024.07.16 |
미니미 프로젝트) KPT 회고 (0) | 2024.07.15 |
방법론) TDD를 할까? 말까? (0) | 2024.07.12 |