[CS] ERD와 정규화 과정

눈치없어·2025년 5월 20일

ERD(Entity Relationship Diagram):

  • 데이터베이스의 뼈대를 시각화한 설계도
  • "무엇(엔터티)이 있으며, 그들 사이에 어떤 관계가 있는지" 를 정의하는 관계형 데이터 모델의 설계도

ERD의 중요성

역할설명
요구사항 분석서비스의 데이터 흐름과 구조를 명확하게 이해하게 해 줌
데이터베이스 설계정규화된 테이블과 관계를 정의하고 SQL 설계에 기반을 제공
디버깅 및 유지보수데이터베이스 구조를 빠르게 파악해 문제 해결에 도움
비즈니스 재설계새로운 기능 추가나 리팩토링 시, 데이터 흐름 파악에 필수

비정형 데이터
비구조화 데이터를 말하며, 미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보



ERD 예제

다음 예제의 서비스 요구 사항과 답을 기반으로 ERD를 작성하며 공부해볼까요? 참고로 정답 ERD의 테이블 필드, 타입은 생략했습니다.

영업부서의 ERD

요구 사항
• 영업사원은 0 ~ n명의 고객을 관리한다.
• 고객은 0 ~ n개의 주문을 넣을 수 있다.
• 주문에는 1 ~ n개의 상품이 들어간다.


게임부서의 ERD

요구 사항
• 선수들은 1명의 챔피언을 고를 수 있다.
• 챔피언은 한 개 이상의 스킬을 갖는다.
• 스킬은 한 개 이상의 특성을 갖는다.



정규화 과정

정규화

릴레이션 간의 이상현상(중복, 삭제, 삽입 이상 등)을 해결하기 위해 테이블을 정제하는 과정

목표

  • 중복 최소화
  • 삽입·삭제·갱신 이상 방지
  • 데이터 구조의 논리적 설계

이상 현상

유형설명
삽입 이상어떤 필드를 NULL 없이 넣기 어렵다 (ex. 유저 등급만 넣고 싶은데 주문정보도 필수인 경우)
삭제 이상데이터를 하나 지우면 다른 중요한 데이터도 함께 사라진다
갱신 이상중복된 데이터를 여러 군데 수정해야 함

정규화 단계별

📌 제1정규형 (1NF)

  • 모든 컬럼이 Atomic(원자값)만 갖도록 분해
  • 조건: 반복 속성 제거 (ex. 수강과목이 {C++, 자바} → 행 2개로 분리)
유저ID수강과목
a_01C++, 자바

1NF 변환 후

유저ID수강과목
a_01C++
a_01자바

📌 제2정규형 (2NF)

  • 1NF + 기본키의 '부분적 종속' 제거
  • 조건: 기본키가 복합키일 때 / 기본키 일부에만 종속된 속성 → 분리 필요
  • 예시
    - {유저ID, 수강명}이 기본키일 때 → 유저번호가 유저ID에만 종속됨 → 분리
    ➡ 유저 테이블 + 수강 테이블로 나눔

📌 제3정규형 (3NF)

  • 2NF + '이행적 종속' 제거
  • 조건: 기본키가 아닌 컬럼이, 또 다른 컬럼에 종속된 경우 제거
  • 예시
    - 등급이 할인율을 결정 → 할인율은 등급에 종속
    ➡ 등급 테이블로 분리

📌 보이스/코드 정규형 (BCNF)

  • 모든 '결정자'가 후보키여야 함
  • 조건: X → Y 에서 X가 후보키가 아니면 분해
  • 예시
    강사 → 수강명
    하지만 강사는 후보키 아님 → 분해 필요
    ➡ 학번-강사, 수강명-강사 분리

용어설명
결정자어떤 값을 결정짓는 컬럼 (A → B → A는 결정자)
함수 종속어떤 컬럼이 다른 컬럼의 값을 결정지음
이행적 종속A → B, B → C → A → C 관계
무손실 분해데이터를 분해해도 정보가 손실되지 않음



참고: 북스터디 - 면접을 위한 CS 전공지식 노트 (Chapter 4-2)

profile
dock 사이즈 다르잖아

0개의 댓글