<aside>
❗
[규칙 1] 한 칸에는 한 가지 정보만 들어가도록 만들어라
- 데이터베이스 테이블을 설계할 때, ‘한 칸에 한 가지 정보만 들어가야 한다.’ 규칙을 지켜야 한다.
Ex) 하나의 이메일만 저장해야지 여러 이메일을 저장하면 안 된다.
**
만약 한 칸에 여러 정보를 저장하게 되면, DB에서 꺼내서 사용할 때
콤마를 제거하여 리스트나 배열에 넣는 작업을 추가로 수행하게 됨 (파싱 작업)
→ 한 칸에 한 가지 정보만 저장하면 데이터를 저장하기도 좋고 관리하기도 좋다.
한 칸에 두 개 이상의 정보가 들어가있을 땐 어떻게 해야 하는가 ??
한 칸에 두 가지 이상의 정보가 들어갈 때는 테이블을 분리하면 된다.
테이블을 분리함으로써, 한 칸에 한 가지 정보만 들어가도록 해야 한다.
- 데이터도 한 눈에 보이고, 한 칸에 한 가지 정보만 들어가 있다.
- 한 칸에 두 가지 이상의 정보가 들어간 경우 테이블을 분리하고 FK를 활용해
한 칸에 한 가지 정보만 들어가게 만들어야 한다.
[잘못된 분리]
- 테이블을 분리하여 특정 사용자의 이메일 주소를 알 수 있게 되었지만
한 칸에 2가지 이상의 정보가 다시 들어가게 됨
- 이럴 때는 FK를 다른 테이블로 옮겨보자.
중요 !!
- 이 과정을 데이터베이스 이론에서 제 1정규형이라고 부른다.
정리
- 데이터 베이스를 설계할 때, 한 칸에 한 가지 정보만 들어가야 한다.
→ 두 가지 정보를 저장하게 되면, 저장하거나 꺼낼 때 파싱을 해야할 뿐만 아니라
이 과정에서 문제가 발생할 수 도 있음 즉, 관리하기 어려워짐
- 한 칸에 여러 정보가 들어간 경우 테이블을 분리하여 한 가지 정보만 들어가도록 한다.
→ FK를 활용하여 연결해준다.
- 테이블을 분리해도 두 가지 이상의 정보가 들어가는 경우
→ FK를 다른 테이블로 옮겨본다.
- 이를 제 1 정규형이라고 한다.
</aside>
<aside>
❗
한 가지 정보는 관점에 따라 달라질 수 있다.
- 이름의 경우 한 가지 정보로 볼 수 있지만
성과 이름으로 분류해서 두 가지 정보로 볼 수 있다.
**** [즉, 서비스에서 데이터의 사용 방식에 따라 결정해야 한다.] ****
Ex) 성과 이름을 따로 조회해야 하는 경우
Ex) 이름만 조회하면 되는 경우
데이터베이스 설계는 처음에하고 끝나는게 아니라
상황에 따라 맞게 변경해야한다.
정리
- 데이터 베이스를 설계할 때, 한 칸에 한 가지 정보만 들어가야 한다.
→ 두 가지 정보를 저장하게 되면, 저장하거나 꺼낼 때 파싱을 해야할 뿐만 아니라
이 과정에서 문제가 발생할 수 도 있음 즉, 관리하기 어려워짐
- 한 칸에 여러 정보가 들어간 경우 테이블을 분리하여 한 가지 정보만 들어가도록 한다.
→ FK를 활용하여 연결해준다.
- 테이블을 분리해도 두 가지 이상의 정보가 들어가는 경우
→ FK를 다른 테이블로 옮겨본다.
- ‘한 가지 정보’의 기준은 절대적이지 않음, 서비스에 맞게 판단해야 한다.
⇒ 컬럼을 분리해서 저장해야 함
- 이를 제 1 정규형이라고 한다.
</aside>
<aside>
❗
[규칙 2] 어떤 테이블에 FK를 넣어도 [규칙 1]을 못 지킬 때는
중간 테이블을 하나 더 만들어라
- 위 테이블은 규칙 1을 위반하고 있다.
- 이를 해결하기 위해 테이블 분리 진행
- 테이블을 분리했지만 규칙 1을 위배
- 외래키를 다른 테이블로 옮겨 보자
- FK의 위치를 다른 테이블로 바꾸어도 규칙 1이 지켜지지 않고 있다.
이런 경우 중간 테이블을 하나 더 만들어야 한다.
- 위와 같이 테이블을 설계하면 어떤 학생이 어떤 과목들을 수강하는지까지 다 파악할 수 있으며
규칙 1도 지킬 수 있게 된다.
- 중간 테이블의 이름은 관계를 표현하는 동사를 적어주는게 좋다.
Ex) 학생과 수강과목을 등록한다. (course_registration - 수강 과목 등록)
- 즉, 두 테이블 간의 매핑 정보를 저장하는 중간 테이블을 만들어야한다는 의미
</aside>
<aside>
❗
[규칙3] 헷갈릴 때는 관계를 파악하라 (1:1, 1:N, N:M)
- 언제 중간 테이블이 들어가야하는지 헷갈릴 때
- 어느 테이블에 FK키가 들어가야 하는지 헷갈릴 때
- 이럴 때 엔티티 관계를 파악해야 한다.
엔티티 관계 파악 방법
-
엔티티 간에 어울리는 동사 찾기
- A(주어)가 B를 ~~~. (A가 주어)
- B(주어)가 A에 의해 ~~~. (B가 주어)
** 서비스 관점에서 동시를 떠올려야 한다.
-
1번 과정에서 찾은 동사를 활용해 적절한 단어(하나의 or 여러 개의) 찾기
- 하나의 A는 (하나의 or 여러 개)의 B를 ~~~. (A 관점)
- 하나의 B는 (하나의 or 여러 개)의 A에 의해 ~~~. (B 관점)
** 문장 처음에 시작하는 하나의 라는 말을 반드시 붙여야 헷갈리지 않는다.
** 서비스를 어떻게 기획하냐에 따라 달리질 수 있다.
반드시 자신의 서비스에 대입해서 생각해야 한다.
-
관계 판단하기
- A, B의 관점 전부 다 하나만 가진다면 A : B = 1 : 1
- A의 관점에서는 여러 개의 B를 가지고 , B의 관점에서 하나의 A를 가진다면 A : B = 1 : N
- A의 관점에서 하나의 B를 가지고, B의 관점에서 여러 개의 A를 가진다면 A : B = N : 1
- A, B의 관점 전부 다 여러 개를 가진다면 A : B = N : M
✅ 예시 1
사용자 (users), 이메일 (emails)
(한 명의 사용자가 회원가입 할 때 여러 개의 이메일을 입력할 수 있는 서비스라고 가정하자.)
- 사용자가 이메일을 소유한다.
- 이메일은 사용자에 의해 소유된다.
- 한 명의 사용자는 여러 개의 이메일을 소유한다(소유할 수 있다).
- 하나의 이메일은 한 명의 사용자에 의해 소유된다.
⇒ 사용자 : 이메일 = 1 : N 관계
✅ 예시 2
가게 (stores), 판매 상품 (products)
- 가게가 판매 상품을 판다.
- 판매 상품은 가게에 의해 팔린다.
- 하나의 가게는 여러 개의 상품을 판다(팔 수 있다).
- 하나의 상품은 하나의 가게에 의해 팔린다.
⇒ 가게 : 상품 = 1 : N
** 공동의 상품이 여러 가게에서 팔리는 경우 N : M
✅ 예시 3
학생 (students), 수강 과목 (courses)
- 학생이 수강 과목을 듣는다.
- 수강 과목은 학생에 의해 들어진다.
- 한 명의 학생은 여러 개의 수강 과목을 듣는다(들을 수 있다).
- 하나의 수강 과목은 여러 학생에 의해 들어진다.
⇒ 학생 : 수강 과목 = N : M
✅ 예시 4
영화 (movies), 배우 (actors)
- 영화는 배우를 출연시킨다. (엄청 자연스럽지 않아도 된다.)
- 배우는 영화에 의해 출연된다.
- 하나의 영화는 여러 배우를 출연시킨다(출연시킬 수 있다).
- 한 명의 배우는 여러 영화에 의해 출연된다(출연될 수 있다).
⇒ 영화 : 배우 = N : M
✅ 예시 5
사용자(users), 프로필(profiles)
- 사용자는 프로필을 가진다.
- 프로필은 사용자에 의해 소유된다.
- 한 명의 사용자는 한 개의 프로필만 가진다(가질 수 있다).
- 한 개의 프로필은 한 명의 사용자한테만 소유된다.
⇒ 사용자 : 프로필 = 1 : 1 관계
</aside>
<aside>
❗
</aside>
<aside>
❗
</aside>
<aside>
❗
</aside>
<aside>
❗
</aside>
<aside>
❗
</aside>
<aside>
❗
</aside>
<aside>
❗
</aside>