본문 바로가기
Develop/DB

[DB] db 모델링 정규화 관계 맺는법

by dev_m.w 2025. 7. 22.

1.중복을 없애야한다.

회원

id name
1 홍길동
2 전민우

 

게시글

id  제목 내용 작성자
1 안녕하세요..... 내용1 홍길동
2 백엔드 자바 공부순서 알려드림 내용2 홍길동 
3 알고리즘 공부하는방법 내용3 전민우
4 요즘 it 백엔드 분야  내용4 ....

 

게시글 테이블에 작성자 컬럼은 홍길동 중복이 되있는것을 확인할수있다.

만약 작성자 이름이 홍길동에서  - > 홍길순으로 바꾸면,

해당 게시글 테이블의 홍길동이 쓴 게시글을 모두 찾아서 작성자 이름을 홍길순으로 바꿔줘야 하는 문제점이 생긴다. 혹시 실수로 바꾸지 못한 행이있다면 이상현상이 발생한다. 이러한 문제가 발생하지 않기 위해서 데이터 중복을 피해야한다.


 

 

[규칙 1] 한 컬럼에는 한가지 정보만 들어가게 설계 한다.

❌ 한컬럼에 두가지 정보를 넣었을떄.

id name email
1 전민우 minwoo867412@naver.com,
qwer@naver.com
2 홍길동 asdj2@naver.com,
qwem@naver.com

 

전민우라는 회원에 email 중에 "minwoo867412@naver.com"라는 데이터만 찾고싶을떄 저렇게 두개를 같이 넣으면 찾기 어려움(문자열을 자르고 여러 작업을 해야함).

 

 

한 컬럼에 2가지 정보가 들어갈떈? 테이블을 분리하자. 

회원

id name
1 홍길동
2 전민우

 

 

이메일

id email
1 minwoo867412@naver.com
2 qwer@naver.com
3 asdj2@naver.com
4 qwem@naver.com

 

 

이메일이라는 테이블을 따로만들었다, 하지만 minwoo867412@naver.com 이라는 이메일은 누구 회원의 이메일인지 알수없다.

 

 

 

회원 테이블에 pk키를 email 테이블 컬럼에 fk로 추가.

 

이메일

id email user_id
1 minwoo867412@naver.com 1
2 qwer@naver.com 1
3 asdj2@naver.com 2
4 qwem@naver.com 2

 

 user_id 컬럼을 추가하고 회원테이블에 pk를 fk로 넣어줌으로써 해당 이메일이 어떤 유저의 것인지 확인이된다. 이러한 과정을 제1정규화라고 부른다


[규칙 2]  어떤 테이블에도 fk를 넣었는데 하나에 컬럼에 값이 2개들어간다면 중간 테이블을 하나 더 만든다.

 

 

학생

id 학생 수강 과목
1. 홍길동 수학,과학
2 전민우 국어,수학
3 국어,과학

 

 

해당 학생 테이블에서 수강 과목 컬럼은 원자값이 2개 이기떄문에, 위에 예시처럼 수강 과목이라는 테이블을 만들어줘야한다. 

 

 

과목

id 과목
1 수학
2 과학
3 국어

 

이렇게 수강과목 이라는 테이블을 따로 만들어주고 어떤 학생들이 어떤 과목을 신청 했는지 알기위해서 학생 pk 값을 수강과목 테이블에 아래 처럼 추가

 

 

❌ 발생하는 문제 

과목

id 과목 학생id
1 수학 1,2
2 과학 1,3
3 국어 2,3

 

 

하지만 여전이 한컬럼에 2가지 원자값이 존재한다.  이러한 경우는 중간 테이블을 추가해줘야한다.

 

학생 테이블과 과목 테이블 사이에 수강 신청이라는 테이블을 하나 만들어 주었다. 

 

 

✅ 해결방법

수강 신청

id 과목id (fk) 학생id (fk
1 1 1
2 1 2
3 2 1
4 2 3
5 3 2
6 3 3

 

과목 테이블의 pk값과, 학생테이블의 pk 값을 수강신청 테이블의 fk 로 가져오면 이러한 문제를 해결할수있다


[규칙 3] 테이블을 설계하고 관계를 맺어보기 .

 

관계를 맺는이유?

위에 처럼 해도되지만 어느 경우엔 이 테이블에 FK가 들어가고, 또 어떤테이블에는 다른 테이블에 FK를 두는지 햇갈렸다. 이러한 경우를 해결하기 위해서 관계를 맺어주면 더 쉽게 해결할수 있다.

 

  엔티티 간에 어울리는 동사 찾기

 

1.    A(주어)가 B를 ______.

       B(주어)가 A에 의해 _____.

 

2. 1번 과정에서 찾은 동사를 활용해 적절한 단어(하나의 OR 여러개의 )찾기

 하나의 A는 (하나의 OR 여러개의 ) B를 ____.

 하나의 B는 (하나의 OR 여러개의) A에 의해 _____.

 위에 예시를 통해, 회원 테이블과 이메일 테이블을 두고 적용한다면 ? 

 

  1:N 관계 특징 (N 쪽의 테이블에 FK가 들어가야 한다)

 

 회원은 이메일을 소유한다.

 이메일은 회원에 의해 소유된다.

 

하나의 유저는 (여러개의) 이메일을 소유한다.

하나의 이메일은 (하나의 ) 회원을  소유된다 -> minwoo867412@naver.com은 전민우라는 회원에만 소유되지 다른 회원인 홍길동인 이메일에 소유되지 않는다.

-> 회원 과 이메일 1: N 관계를 갖는다. 그래서 N인 이메일 테이블에 FK키를 두어야한다.

 

 

  N:M 관계 특징 (중간 테이블을 만들어야 한다)

1. 중간 테이블을 둔다.

2. 중간 테이블에 두 테이블에  FK 키가 추가되어야 한다.

3. N:M 관계에서 중간 테이블을 추가해 1:N 관계로 바꿔 표현한다.

 

 

학생은 수업을 수강한다.

수업은 학생에 의해 수강된다.

 

하나의 학생은 여러개의 수업을 수강한다.

하나의 수업은 여러개의 학생에 의해 수강된다 -> 즉 수학 수업은 한명의 학생만 듣는게 아니고 여러 학생이 들을수 있다.

 

학생과 수업의 관계는 M:N 관계를 갖는다. 이러한 경우는 중간 테이블을 두고 두 테이블에 FK 키가 추가 되어야 한다.

 

  1:1 관계 특징 (아무 테이블에 FK를 넣어도 된다)

1. 아무 테이블에 FK를 넣어도 상관 없음.

2. 테이블을 서로 합쳐도 되는지 고려해 본다.

 



'Develop > DB' 카테고리의 다른 글

@Transaction,DB락  (0) 2025.05.27
JDBC ,커넥션풀 이해  (0) 2025.05.25