1.중복을 없애야한다.
회원
id | name |
1 | 홍길동 |
2 | 전민우 |
게시글
id | 제목 | 내용 | 작성자 |
1 | 안녕하세요..... | 내용1 | 홍길동 |
2 | 백엔드 자바 공부순서 알려드림 | 내용2 | 홍길동 |
3 | 알고리즘 공부하는방법 | 내용3 | 전민우 |
4 | 요즘 it 백엔드 분야 | 내용4 | .... |
게시글 테이블에 작성자 컬럼은 홍길동 중복이 되있는것을 확인할수있다.
만약 작성자 이름이 홍길동에서 - > 홍길순으로 바꾸면,
해당 게시글 테이블의 홍길동이 쓴 게시글을 모두 찾아서 작성자 이름을 홍길순으로 바꿔줘야 하는 문제점이 생긴다. 혹시 실수로 바꾸지 못한 행이있다면 이상현상이 발생한다. 이러한 문제가 발생하지 않기 위해서 데이터 중복을 피해야한다.
[규칙 1] 한 컬럼에는 한가지 정보만 들어가게 설계 한다.
❌ 한컬럼에 두가지 정보를 넣었을떄.
id | name | |
1 | 전민우 | minwoo867412@naver.com, qwer@naver.com |
2 | 홍길동 | asdj2@naver.com, qwem@naver.com |
전민우라는 회원에 email 중에 "minwoo867412@naver.com"라는 데이터만 찾고싶을떄 저렇게 두개를 같이 넣으면 찾기 어려움(문자열을 자르고 여러 작업을 해야함).
한 컬럼에 2가지 정보가 들어갈떈? ⭕ 테이블을 분리하자.
회원
id | name |
1 | 홍길동 |
2 | 전민우 |
이메일
id | |
1 | minwoo867412@naver.com |
2 | qwer@naver.com |
3 | asdj2@naver.com |
4 | qwem@naver.com |
이메일이라는 테이블을 따로만들었다, 하지만 minwoo867412@naver.com 이라는 이메일은 누구 회원의 이메일인지 알수없다.
⭕ 회원 테이블에 pk키를 email 테이블 컬럼에 fk로 추가.
이메일
id | 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 |