[DB] 데이터베이스 정규화

2024. 8. 29. 19:03·Database

[작성일: 2023. 03. 24]

 

정규화(Normalization)

기본 목표

  • 테이블 간의 중복된 데이터를 허용하지 않는 것
  • 무결성을 유지하며 DB의 저장 공간을 줄일 수 있음.

 

 

 

정의

  • 삽입, 수정, 삭제 시 발생할 수 있는 이상현상을 줄이는 과정
  • 테이블을 분할하는 것이며 보통 3차 정규화까지 진행함.

 

 

 

이상현상(Anomaly)

  • 테이블의 잘못된 설계로 인해 불필요한 데이터가 중복되어 공간이 낭비되는 현상

 

ID Name Major Classcode Classname members
apple ahn com. C001 Java 30
apple ahn com. C002 DMBS 35
apple ahn com. C003 Python 30
kpple kwon mgmt. A001 Father 10
lpple lee sea. B001 Ship 10

 

삽입 이상

  • 새로운 데이터를 넣기 위해 불필요한 데이터도 넣어야 하는 문제가 발생함.
  • 과목이 정해지지 않은 학생을 넣으려면 수업명을 비워둘 수 없기 때문에 수업코드 X001, 수업명 '미정' 등을 새로 만들어서 넣어야 하는 이슈 발생.

 

갱신 이상

  • 중복된 행 중에 일부만 변경해서 데이터가 불일치 하는 문제가 발생함.
  • ahn 학생이 com 전공을 포기하고 machine으로 편입하면 학과 뿐만 아니라 연관된 3개의 데이터를 전부 바꿔야 함.

 

 

삭제 이상

  • 행을 삭제하면 필요한 데이터까지 삭제되는 문제가 발생함.
  • Father 수업을 폐강하면 kwon 데이터까지 삭제되는 실수 발생

 

 

 

정규화의 종류

1차 정규화

  • 하나의 컬럼에는 하나의 정보(값)만 존재해야 함. ➡ 원자성

 

ex ) SimCity Game 
User Building Cost Place PlaceSize
Bach Farm, Fac. 50, 70 Plain, City 100, 200
Mozart Farm, Fac. Cos. 50, 70, 200 Plain, City, City 100, 200, 200
Tscai Fac. 70 Shore 500

 

  • 위의 테이블처럼 정보를 합쳐서 작성하면 안 됨.
  • 아래의 테이블처럼 작성한다면 1차 정규화는 패스해도 됨.

 

User Billding Cost Place PlaceSize
Bach Farm 50 Plain 100
Bach Fac. 70 City 200
Mozart Farm 50 Plain 100
Mozart Fac. 70 City 200
Mozart Cos. 200 City 200
Tscai Fac. 70 Shore 500

 

 

 

2차 정규화

  • 후보키(User+Building)의 진부분집합에서 부분함수 종속성을 제거하는 작업
    • Place로 작업할 수 없는 이유는 Place가 후보키가 아니기 때문임. (3차 정규화에서 진행)
  • 부분함수적 종속을 완전함수적 종속으로 만드는 과정
  • 아래의 표가 2차 정규화가 된 테이블, Building과 Cost가 독립하여 새로운 테이블이 생김.

 

User Building Place PlaceSize
Bach Farm Plain 100
Bach Fac. City 200
Mozart Farm Plain 100
Mozart Fac. City 200
Mozart Cos. City 200
Tscai Fac. Shore 500

 

Building Cost
Farm 50
Fac. 70
Cos. 200

 

 

 

3차 정규화

  • 1차 정규화 및 2차 정규화를 만족하고, 이행적 함수적 종속을 갖지 않는 정규형
  • 이행적 함수적 종속: A값을 알면 B값을 알고, B값을 알면 C값을 알 수 있는 관계
    • 종속된 것이 있는데 PK 소속이 아닌 종속

 

Place PlaceSize
Plain 100
City 200
Shore 500

 

 

 

 

 

 

 

 

 

 


🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

 

저작자표시 비영리 변경금지 (새창열림)
'Database' 카테고리의 다른 글
  • [DB] Join
  • [DB] 반정규화
  • [DB] function
  • [DB] case when, Scalar Subquery
뚜비
뚜비
1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
  • 뚜비
    뚜비의 개발로그
    뚜비
  • 전체
    오늘
    어제
  • 글쓰기     관리
    • Devlog
      • Back-End
        • Java
        • Spring
        • JPA
        • HTTP
        • Security
        • Back-End
        • Front-End
      • 알고리즘
      • iOS
        • Swift
      • Database
      • Tips
        • Git & GitHub
        • A to Z
      • 프로젝트
      • 생각정리
  • 태그

    성능최적화
    html
    javascript
    jsp
    MVC
    스프링
    Spring Security
    알고리즘
    Java
    Security
    HTTP
    자바
    변수
    데이터베이스
    객체
    다형성
    게시판만들기
    최주호
    백준
    JPA
    Swift
    김영한
    자바스크립트
    spring
    프로그래머스
    Database
    sql
    생성자
    의존성주입
    DB
  • hELLO· Designed By정상우.v4.10.0
뚜비
[DB] 데이터베이스 정규화
상단으로

티스토리툴바