[DB 설계] 데이터베이스 모델링(Database Modeling) - 관계를 파악해 빠르게 제 1 정규화 진행하기

iiingkeep·2024년 12월 2일

Database

목록 보기
16/21

앞선 게시글에서 제 1 정규화를 진행하는 방법을 알아봤다.
https://velog.io/@iiingkeep/DB-설계-데이터베이스-모델링Database-Modeling-제-1-정규형1NF-First-Normal-Form
하지만 Foreign key를 어디에 두어야 하는지 명확하지 않아 일일이 시도해봐야 했다.
이제 Forein key로 어느 테이블에 컬럼을 생성해야 하는지 빠르게 알 수 있는 방법을 알아 볼 것인데, 핵심은 "관계 파악"이다.

테이블간 관계 파악하기

테이블간 관계를 파악하는 방법은 다음과 같다.

1. 엔터티간의 관계를 나타낼 수 있는 동사를 사용해 문장 완성하기

  • 학생과 과목
    • 학생은 과목을 수강한다.
    • 과목은 학생에 의해 수강되어진다.
  • 가게와 상품
    • 가게는 상품을 판매한다.
    • 상품은 가게에 의해 판매된다.
  • 사용자와 프로필
    • 사용자는 프로필을 사용한다.
    • 프로필은 사용자에 의해 사용된다.

2. 엔터티 간의 관계가 하나 또는 다수로 성립되는지를 확인해 문장 완성하기

이 때 헷갈리지 않기 위해 한 개의 개체와 다른 개체가 어떤 관계인지 꼭 기재

  • 학생과 과목
    • 한 명의 학생은 여러개의 과목을 수강한다.
    • 한 개의 과목은 여러명의 학생에 의해 수강되어진다.
  • 가게와 상품(가게들이 각자의 고유 상품만 판매할 때)
    • 한 곳의 가게는 여러 개의 상품을 판매한다.
    • 한 개의 상품은 한 곳의 가게에 의해 판매된다.
  • 사용자와 프로필(한 명의 사용자가 프로필을 하나만 사용할 수 있을 때)
    • 한 명의 사용자는 한 개의 프로필을 사용한다.
    • 한 개의 프로필은 한 명의 사용자에 의해 사용된다.

3. 문장에 따라 관계 표현하기

  • 학생과 과목
    • 학생 : 과목 = N : M
  • 가게와 상품
    • 가게 : 상품 = 1 : N
  • 사용자와 프로필
    • 사용자 : 프로필 = 1: 1

정규화 진행하기

관계를 파악했다면 다음의 규칙에 따라 제 1 정규화를 진행한다.

관계에 따른 테이블 분리 규칙

1. N : M 관계

중간 테이블을 생성한 뒤 그 테이블에 두 테이블의 Foreign key를 넣는다.

예시)
아래의 학생 테이블을 정규화 하여 학생 테이블과 과목 테이블로 분리할 때 관계는 학생 : 과목 = N : M 이다.
이 때 중간 테이블인 수강 테이블을 생성한 후 학생 테이블의 id와 과목 테이블의 id를 모두 Foreign key로 넣는다.
이후에는 관계를 새롭게 설정한다 → 학생 : 등록 = 1 : N / 과목 : 등록 = 1 : N

정규화 이전)

students Table

id이름수강 과목
1김지민국어, 수학
2이은서수학, 과학
3전서진국어, 과학

정규화 이후)

students Table

id이름
1김지민
2이은서
3전서진

subjects Table

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

course_registrations Table

id학생 id(FK)과목 id(FK)
111
212
322
423
531
633

2. 1 : N 관계

N쪽의 테이블에 Foreign key를 넣는다.

예시)
아래의 가게 테이블을 정규화 하여 가게 테이블과 상품 테이블로 분리할 때
관계는 가게 : 상품 = 1 : N 이다.
이 때 N쪽인 상품 테이블에 가게 id를 Foreign key로 넣는다.

정규화 이전)

stores Table

id가게명판매 상품
1DB 카페아메리카노, 카페라떼
2데이터 국밥수육국밥, 순대국밥, 선지국밥

정규화 이후)

stores Table

id가게명
1DB 카페
2데이터 국밥

products Table

id판매 상품가게 id(FK)
1아메리카노1
2카페라떼1
3수육국밥2
4순대국밥2
5선지국밥2

3. 1 : 1 관계
둘 중 아무 테이블에 Foreign key를 넣어도 된다.

예시)
아래의 사용자 테이블을 정규화 하여 사용자 테이블과 프로필 테이블로 분리할 때
관계는 사용자 : 프로필 = 1 : 1 이다.
이 때 사용자 테이블에 프로필 id를 Foreign key로 넣거나 프로필 테이블에 사용자 id를 Foreign key로 넣는다. 원하는 곳에 넣으면 된다.

정규화 이전)

users Table

id이메일비밀번호프로필사진닉네임자기소개
1k@k.com123https ://k.com/1짱구안녕하세요.
2n@n.com132https ://n.com/2흰둥멍멍
3j@j.com213https ://j.com/3맹구....

정규화 이후)

경우1)
사용자 테이블에 프로필 id를 Foreign key로 넣은 경우

users Table

id이메일비밀번호프로필 id(FK)
1k@k.com1231
2n@n.com1322
3j@j.com2133

profiles Table

id프로필사진닉네임자기소개
1https ://k.com/1짱구안녕하세요.
2https ://n.com/2흰둥멍멍
3https ://j.com/3맹구....

경우2)
프로필 테이블에 사용자 id를 Foreign key로 넣은 경우

users Table

id이메일비밀번호
1k@k.com123
2n@n.com132
3j@j.com213

profiles Table

id프로필사진닉네임자기소개사용자 id(FK)
1https ://k.com/1짱구안녕하세요.1
2https ://n.com/2흰둥멍멍2
3https ://j.com/3맹구....3

하지만 정규화 과정에서 분리한 테이블의 관계가 1:1이고, 큰 이점이 없다면 이후에 join 등으로 인한 성능 저하가 발생하지 않도록 이 테이블은 분리하지 않고 그대로 사용하는 것이 오히려 좋을 수 있다.
왠만하면 1:1 관계로 분리하지 않는 것을 추천!


참고

이 게시글은 박재성님의 비전공자도 이해할 수 있는 DB 설계 입문/실전 강의를 토대로 작성되었습니다.
https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-db-%EC%84%A4%EA%B3%84-%EC%9E%85%EB%AC%B8/dashboard

profile
혁신적인 백엔드 개발자가 되고자, 기록✏️

0개의 댓글