backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 정규화(Normalization)
  • 정규화의 주요 개념
  • 정규화 단계
  • 제4정규형(4NF, Fourth Normal Form)
  • 제5정규형(5NF, Fifth Normal Form)
  • 디노멀라이제이션(Denormalization)
  1. DB&SQL

10 정규화

정규화(Normalization)

정규화는 데이터베이스의 중복 데이터를 최소화하고 데이터 무결성을 유지하며 삽입, 갱신, 삭제 시 발생하는 **이상 현상(Anomaly)**을 방지하기 위해 테이블 구조를 체계적으로 분해하는 과정입니다. 정규화는 **정규형(Normal Form)**이라는 규칙을 단계별로 적용하며 진행됩니다.


정규화의 주요 개념

  1. 슈퍼 키(Super Key) 테이블의 각 튜플을 유일하게 식별할 수 있는 속성의 집합입니다.

  2. 후보 키(Candidate Key) 슈퍼 키 중에서 불필요한 속성을 제거해 더 이상 축소할 수 없는 키입니다.

  3. 기본 키(Primary Key) 후보 키 중에서 선택된 키로, 테이블의 주 식별자로 사용됩니다.

  4. 논 프라임 속성(Non-Prime Attribute) 기본 키에 속하지 않는 속성입니다.

  5. 함수 종속성(Functional Dependency) 속성 X의 값이 속성 Y의 값을 결정할 때, Y는 X에 종속된다고 합니다. 예시: X → Y (X가 Y를 결정).

  6. 부분 함수 종속(Partial Dependency) 복합 키 중 일부 속성에만 종속되는 것을 의미합니다.

  7. 이행적 종속(Transitive Dependency) X → Y이고, Y → Z이면 X → Z가 성립하는 종속성을 의미합니다.


정규화 단계

1NF (제1정규형)

규칙: 모든 속성의 값은 단일 값(Atomic)을 가져야 한다.

  • 다중 값, 반복 그룹은 제거해야 합니다.

1NF 위반 예시:

| 고객ID | 이름   | 전화번호           |
|--------|--------|------------------|
| 1      | 홍길동 | 010-1111, 010-2222 |

1NF 적용 후:

| 고객ID | 이름   | 전화번호     |
|--------|--------|------------|
| 1      | 홍길동 | 010-1111   |
| 1      | 홍길동 | 010-2222   |

2NF (제2정규형)

규칙: 1NF를 만족하고, 모든 논 프라임 속성은 기본 키에 대해 완전 함수 종속(Full Functional Dependency)을 만족해야 한다.

  • 부분 함수 종속(Partial Dependency)을 제거합니다.

2NF 위반 예시:

| 수강ID | 학생ID | 과목명   | 교수명   |
|--------|--------|---------|---------|
| 1      | 101    | 수학     | 홍길동   |
| 2      | 101    | 과학     | 김철수   |
  • 과목명 → 교수명 종속성이 존재하며, 복합 키(수강ID, 학생ID) 일부만 종속됩니다.

2NF 적용 후:

  1. 수강 정보 테이블:

| 수강ID | 학생ID | 과목명   |
|--------|--------|---------|
| 1      | 101    | 수학     |
| 2      | 101    | 과학     |
  1. 과목 정보 테이블:

| 과목명   | 교수명   |
|---------|---------|
| 수학     | 홍길동   |
| 과학     | 김철수   |

3NF (제3정규형)

규칙: 2NF를 만족하고, 논 프라임 속성이 다른 논 프라임 속성에 이행적 종속(Transitive Dependency)되지 않아야 한다.

  • 이행 종속을 제거합니다.

3NF 위반 예시:

| 학생ID | 이름   | 학과ID | 학과명   |
|--------|--------|--------|---------|
| 101    | 홍길동 | 10     | 컴퓨터공학 |
| 102    | 김철수 | 20     | 전자공학   |
  • 학과ID → 학과명 이행 종속이 발생합니다.

3NF 적용 후:

  1. 학생 테이블:

| 학생ID | 이름   | 학과ID |
|--------|--------|--------|
| 101    | 홍길동 | 10     |
| 102    | 김철수 | 20     |
  1. 학과 테이블:

| 학과ID | 학과명   |
|--------|---------|
| 10     | 컴퓨터공학 |
| 20     | 전자공학   |

BCNF (Boyce-Codd Normal Form)

규칙: 3NF를 만족하고, 모든 함수 종속에서 결정자(Determinant)는 반드시 후보 키(Candidate Key)여야 한다.

  • 비정상적인 종속성이 남아 있는 경우를 해결합니다.

BCNF 위반 예시:

| 클래스  | 뱅크네임  |
|---------|---------|
| 스타     | 국민은행   |
| 로얄     | 국민은행   |
| 브론즈   | 우리은행   |
  • 클래스 → 뱅크네임 종속성이 존재하지만, 클래스는 후보 키가 아닙니다.

BCNF 적용 후:

  1. 클래스 정보 테이블:

| 클래스  | 뱅크네임  |
|---------|---------|
| 스타     | 국민은행   |
| 로얄     | 국민은행   |
| 브론즈   | 우리은행   |
  1. 원래 테이블에서는 뱅크네임 속성을 제거하고 클래스만 유지합니다.


제4정규형(4NF, Fourth Normal Form)

정의

**제4정규형(4NF)**는 **다치 종속(Multi-Valued Dependency, MVD)**를 제거하는 것을 목표로 합니다. 테이블이 BCNF를 만족하면서, 하나의 속성 값이 다른 여러 속성 값들과 독립적으로 연관될 때 이를 다치 종속으로 간주하고 이를 제거합니다.


다치 종속(Multi-Valued Dependency, MVD)란?

  • 속성 X가 속성 Y와 Z에 대해 독립적인 관계를 가질 때 발생합니다.

  • 이는 X →→ Y와 X →→ Z라는 두 개의 독립적인 다치 종속성을 가진 경우를 의미합니다.

예시:

| 학생ID | 수업       | 취미       |
|--------|-----------|-----------|
| 1      | 수학       | 축구       |
| 1      | 과학       | 축구       |
| 1      | 수학       | 음악       |
| 1      | 과학       | 음악       |
  • 학생ID →→ 수업: 한 학생이 여러 수업을 수강할 수 있습니다.

  • 학생ID →→ 취미: 한 학생이 여러 취미를 가질 수 있습니다.

  • 하지만 수업과 취미는 서로 독립적입니다.


4NF 위반 문제

위 예시에서는 수업과 취미가 서로 독립적이므로, 데이터가 불필요하게 중복되어 저장되고 있습니다.


4NF 적용

다치 종속성을 분리하여 테이블을 나눕니다.

  1. 학생-수업 관계 테이블:

| 학생ID | 수업   |
|--------|-------|
| 1      | 수학   |
| 1      | 과학   |
  1. 학생-취미 관계 테이블:

| 학생ID | 취미   |
|--------|-------|
| 1      | 축구   |
| 1      | 음악   |

결과:

  • 각 테이블은 중복 없이 독립적인 정보를 저장하게 되며, 다치 종속성을 제거하여 4NF를 만족합니다.


4NF를 적용하는 이유

  • 다치 종속성을 제거하여 데이터 중복을 줄이고, 삽입, 삭제, 갱신 시 발생할 수 있는 이상 현상(Anomaly)을 방지합니다.


제5정규형(5NF, Fifth Normal Form)

정의

**제5정규형(5NF)**는 **조인 종속(Join Dependency)**을 제거하는 것을 목표로 합니다. 테이블이 4NF를 만족하면서, 모든 관계가 조인으로 정확히 표현될 수 있어야 하며, 조인으로 인해 불필요한 데이터 중복이 발생하지 않아야 합니다.


조인 종속(Join Dependency, JD)란?

  • 테이블을 다시 조합(조인)했을 때 원래의 테이블로 복구할 수 있는 관계를 말합니다.

  • 조인 종속은 데이터가 여러 테이블로 분리될 때 발생할 수 있는 중복 문제를 다룹니다.


5NF 위반 예시

| 학생ID | 과목       | 교수       |
|--------|-----------|-----------|
| 1      | 수학       | 홍길동     |
| 1      | 과학       | 김철수     |
| 2      | 수학       | 홍길동     |
| 2      | 과학       | 김철수     |
  • 여기서 학생ID → 과목, 과목 → 교수라는 관계가 있지만, 학생ID와 교수는 직접적인 관계가 없습니다.

  • 이 관계를 3개의 독립적인 테이블로 분리할 수 있습니다.


5NF 적용

  1. 학생-과목 테이블:

| 학생ID | 과목   |
|--------|-------|
| 1      | 수학   |
| 1      | 과학   |
| 2      | 수학   |
| 2      | 과학   |
  1. 과목-교수 테이블:

| 과목   | 교수   |
|-------|-------|
| 수학   | 홍길동 |
| 과학   | 김철수 |
  1. 학생-교수 테이블 (조인으로 재구성 가능):

| 학생ID | 교수   |
|--------|-------|
| 1      | 홍길동 |
| 1      | 김철수 |
| 2      | 홍길동 |
| 2      | 김철수 |

5NF의 특징

  • 데이터 중복을 완전히 제거합니다.

  • 모든 관계가 조인을 통해 원래의 테이블로 복구될 수 있습니다.


5NF를 적용하는 이유

  • 데이터 모델이 매우 복잡한 경우(예: 다대다 관계) 데이터의 중복을 제거하고 무결성을 보장하기 위해 사용합니다.

  • 그러나 대부분의 실무에서는 4NF까지만 적용하며, 5NF는 특정 상황에서만 필요합니다.

디노멀라이제이션(Denormalization)

정규화는 중복을 최소화하지만, 테이블이 과도하게 분할되면 성능 저하나 조인(Join) 비용이 커질 수 있습니다. 이를 방지하기 위해 중복을 허용하면서 테이블을 병합하는 과정을 디노멀라이제이션이라고 합니다.

Previous실습스키마Next실습 스키마

Last updated 4 months ago