CODING/강의노트-JSCODE 박재성

[DB 설계] 섹션 3 - DB 설계의 핵심 원칙 및 전체 과정

codingTrip 2025. 5. 27. 21:42

https://inf.run/pxDWY
[본 게시물은 파트너스 활동의 일환으로 소정의 수수료를 받을 수 있습니다.]



DB 설계할 때 이런 개념들 몰라도 아무 문제 없습니다!

기본키, 후보키, 대체키, 슈퍼키

출처 : https://blog.naver.com/gongtong/150135665812

개체-관계 모델

출처 : https://velog.io/@rg970604/데이터베이스-4.-개념적-데이터-모델링

모델링 과정 (개념적 모델링, 논리적 모델링, 물리적 모델링)

출처 : https://velog.io/@devyjkwon/DB-Modeling

이상현상 (삭제이상, 삽입이상, 수정이상)

https://velog.io/@h5ss/240129-이상현상과-정규화

함수 종속성

https://velog.io/@h5ss/240129-이상현상과-정규화

제1정규형 ~ 제5정규형, BCNF 정규형 / 부분적 함수 종속, 이행적 함수 종속

출처 : https://sommda.tistory.com/92

 

나의 경우에는 정보처리기사 자격증을 준비할 때 공부했었지만,

해당 강의에서는 위의 개념을 당장 몰라도 DB 설계를 할 수 있게 만들어주신다고 하셨다.

그래서 더 이 강의가 기대가 되기 시작했다.

 


DB 설계 시 꼭 기억해야 할 핵심 원칙 1가지

✅ DB 설계의 핵심은 ‘중복 없애기’이다.

데이터베이스를 설계할 때 딱 1가지만 기억하면 된다.

 

중복 없애기

 

 

아래 예시

users (사용자)

id 이름
1 박재성
2 김유찬

 

posts(게시글)

id 제목 내용 작성자
1 [속보] 개발자 채용 확대 내용1 박재성
2 취업 꿀팁 공유합니다! 내용2 박재성
132 어제 면접 보고 온 썰 내용3 박재성

박재성 -> 박지성 개명함
그래서 게시글 작성자 이름도 전부 박재성 -> 박지성 수정해야 함
모든 데이터를 뒤져서 박재성 -> 박지성 수정해야 함

 

users (사용자)

id 이름
1 박지성
2 김유찬

 

posts(게시글)

id 제목 내용 작성자
1 [속보] 개발자 채용 확대 내용1 박지성
2 취업 꿀팁 공유합니다! 내용2 박지성
132 어제 면접 보고 온 썰 내용3 박재성

 

그런데 위 테이블에서 1, 2번 게시글의 작성자 이름만 고치고, 실수로 132번의 게시글을 안 고침
그러다 6개월 정도가 지난 후 132번 게시글에 신고가 들어옴
그런데 데이터베이스에서 작성자 이름인 박재성이라는 사용자를 암만 뒤져도 안 나오는 것이다.
즉, 데이터가 꼬여버린 것

 

이런 문제가 발생한 가장 근본적인 이유는 데이터 중복 때문이다.
중복되는 데이터가 많으면 많을수로 무언가를 수정할 때 중복되는 모든 데이터를 찾아서 고쳐야 한다.
이 때, 실수로 중복된 데이터를 누락해서 수정을 하지 않는 경우가 발생하고, 이렇게 되면 데이터들 사이에 모순이 생겨버린다.

 

 

이상현상(Anomaly) : 저장된 데이터들 중에서 모순되는 상황이 생긴 현상
위의 경우는 이상현상(Anomaly) 중 갱신 이상(Update Anomaly)에 해당함
DB 설계 할 때 이 용어는 하나도 중요하지 않으니 눈으로 보고만 넘어가자.

 

 

이런 문제를 해결하기 위해 만들어낸 DB 설계 방법이 정규화(Normalization)다.

 

✅ 정규화(Normalization)란?

데이터들 사이에서 발생한 모순의 근본적인 원인이 데이터 중복이라고 했다.

이런 문제를 해결하려면 데이터 중복을 없애면 된다.

DB를 설계하면서 중복을 없애는 과정이 바로 정규화(Normalization)다.

제1정규형, 제2정규형, 제3정규형 등 모든 정규형은 중복을 없애게 해주는 방법들이다.

 

[각 정규형의 의미]

정규형에는 총 6가지 종류의 정규형이 있지만

실제 현업에서 적용시키는 정규형은 1정규형, 2정규형, 3정규형

이유 : BCNF, 4정규형, 5정규형을 적용시키면 지나치게 테이블이 분리되어서 관리가 복잡해지기 때문

 

위의 각 정규형 의미를 모르더라도, 결국 1정규형~3정규형을 전부 다 지킨 테이블이 설계를 앞으로 알려줄 것

 

나만의 독창적인 방법이 아닌 내가 만나왔던 현업 개발자들도 전부 이렇게 DB 설계를 한다.
곧 그 방법들을 알려줄테니 차근차근 잘 따라와보자.

 

 

✅ 요약

데이터의 중복이 생기게끔 테이블을 설계하면 데이터끼리 꼬일 수 있다.

따라서 테이블을 설계할 때 데이터 중복이 발생하지 않게끔 설계해야 한다.

 

참고) 면접용 답변 방법
RDBMS에서 데이터 모델링을 할 때는 정규화를 통해 데이터 중복을 최소화할 수 있게 설계해야 합니다. 그래야 삽입 이상, 수정 이상, 삭제 이상과 같은 이상현상을 방지할 수 있으며 데이터 무결성을 지킬 수 있습니다.

 

🧑🏻 이상현상, 정규화, 1정규형~3정규형 등의 이론적인 개념은 나중에 따로 학습하기.
가장 먼저 배워야 하는 건 DB 설계의 모든 이론을 배우는 게 아니라, DB 설계를 실제로 할 수 있는 능력을 갖추는 것

스마트폰을 처음 사용할 때 설명서를 처음부터 끝까지 정독한 뒤에 스마트폰을 쓰지 않는다.
가장 필요한 기능인 전화, 문자 같은 기능들 위주로 먼저 익혀서 사용하고
그 다음 부가적인 기능들을 하나씩 익혀나가는 식으로 사용한다. 이게 제일 효율적인 공부 방법이다.

개발 분야는 학교 내신 시험처럼 공부해야 하는 분야가 아니다.
이론은 빠삭하게 아는데 실전에서는 아무 것도 할 수 없다면 잘못 배운거다.
내가 스스로 생각해서 실제 프로젝트에서 적용시킬 수 있어야 제대로 배운거다.

 

결론 : 이론보다는 실전에서 사용할 수 있도록 공부하자


DB 설계 전체 과정

✅ DB 설계 전체 과정

👨🏻‍🏫 많은 책들에서는 데이터베이스 모델링 방법이 아주 복잡하게 설명되어 있고, 정규화의 개념 조차 이해하기가 너무 어렵다.
쉽게 데이터베이스 모델링 하는 방법을 알려줄 것이다.
이 방식대로 모델링을 하다보면 자연스럽게 정규화 과정을 지키게 된다.

 

1. 저장해야 하는 데이터 파악하기

DB 설계 전
어떤 데이터를 저장해야 하는 지 파악해야 함
그러려면 대략적인 UI(화면) 디자인이 나와있어야 함

출처 : https://brunch.co.kr/@sarayun/61

 

UI 디자인이 나오기 전인 경우
아래와 같은 요구 사항이라도 정리되어 있어야
어떤 데이터를 저장해야 하는 지 파악 가능함

(요즘에는 아래와 같은 ‘요구사항 정의서’는 작성하지 않는 추세)

요구 사항 명세서(출처 : https://ahnty0122.tistory.com/130)

 

2. 그룹핑해서 분류하기

[예시]

  • 아이디, 패스워드, 이름, 이메일 → 사용자
  • 영화 이름, 영화에 출연한 배우, 영화 상영 시간 → 영화
  • 게시글 제목, 게시글 내용, 게시글 생성 시간 → 게시글

저장해야 하는 데이터를 묶어서 그룹핑할 수 있는 상위개념을 찾아야 함

6가지 규칙 적용시키면서 테이블 분리해나가기

(이 6가지 규칙에 대해서는 곧 설명할 예정이다.)


저장할 데이터 파악하기 / 그룹핑해서 분류하기

✅ 요구 사항

🧑🏻현업에서 아래와 같이 글로만 된 요구 사항만 가지고 DB 설계를 하는 일은 잘 없다.
UI(화면) 디자인이 나왔을 때 UI 디자인을 보면서 DB 설계에 들어가는 편이다.
하지만 지금은 연습을 하기 위함이니까 아래 요구사항만 가지고 설계를 해보자.
  • 회원가입 기능
    • 회원가입을 할 때 이메일, 비밀번호, 이름의 정보를 받는다.
  • 로그인 기능
    • 로그인할 때 이메일, 비밀번호를 활용해서 로그인한다.
  • 게시글 작성 기능
    • 로그인한 사용자만 게시글을 작성할 수 있다.
    • 게시글에는 제목과 내용을 작성할 수 있다.
  • 게시글 조회 기능
    • 작성자, 게시글 제목, 게시글 내용, 게시글 작성 시간을 조회할 수 있어야 한다.

✅ 저장할 데이터 파악하기

🧑🏻요구사항을 보면서 데이터베이스에 어떤 데이터를 저장해두어야 할 지 파악하는 게 가장 먼저다.
어떤 데이터를 저장해두어야 하는 지 파악해야, 어떤 방식으로 데이터를 분류해서 저장할 지 결정할 수 있다.
  • 회원가입 기능
    • 회원가입을 할 때 이메일, 비밀번호, 이름의 정보를 받는다.
  • 로그인 기능
    • 로그인할 때 이메일, 비밀번호를 활용해서 로그인한다.
  • 게시글 작성 기능
    • 로그인한 사용자만 게시글을 작성할 수 있다.
    • 게시글에는 제목내용을 작성할 수 있다.
  • 게시글 조회 기능
    • 게시글 제목, 게시글 내용, 게시글 작성 시간, 작성자를 조회할 수 있어야 한다.

=> 이 데이터를 언젠가는 꺼내 쓸 일이 있을 것 같다. 조회해야 될 일이 있을 것 같다라고 생각이 든다면 저장해야 함


✅ 그룹핑해서 분류하기

🧑🏻저장해야 하는 데이터를 묶어서 그룹핑 할 수 있는 상위 개념을 찾아야 한다. 이렇게 그룹핑 된 하나의 그룹을 보고 데이터베이스에서는 엔티티(Entity)라고 얘기한다. 엔티티(Entity)데이터베이스의 테이블(Table)이라고 생각해도 된다.

이메일, 비밀번호, 이름 → 사용자

작성자, 게시글 제목, 게시글 내용, 게시글 작성 시간 → 게시글

 

✅ 테이블로 나타내기

users (사용자)

id 이메일 비밀번호 이름
       
       

posts (게시글)

id 제목 내용 작성 시간 작성자