worldint
mathengi
worldint
전체 방문자
오늘
어제
  • 분류 전체보기 (152)
    • infra, cloud (4)
      • aws (4)
    • TIL,WIL(일간,주간 회고) (57)
    • 컴퓨터 공학 (5)
      • 정보통신 (3)
      • 컴퓨터 구조 (2)
    • Math (1)
      • linear algebra (0)
      • 명제와 집합 (1)
    • Operating System (8)
      • Linux Ubuntu (1)
    • programming (66)
      • c , c++ (9)
      • c# (0)
      • java (2)
      • javascript (14)
      • Python (4)
      • github (1)
      • programing terms (12)
      • html, css (2)
      • docker (3)
      • algorithm_datastructure (5)
      • database (11)
      • flutter(dart) (2)
    • 항해99 부트캠프 (7)
      • 사전교육 (7)
    • 보안관련 (1)

블로그 메뉴

    공지사항

    인기 글

    태그

    • db데드락
    • docker
    • NoSQL
    • Javascript
    • flutter #provider #error
    • ec2 #코드디플로이 #리눅스
    • AWS
    • NVM
    • nodejs
    • 디비데드락
    • ci/cd
    • Blue/Green
    • MongoDB
    • EC2
    • node
    • CloudFront
    • MONGOOSE

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    worldint

    mathengi

    programming/database

    데이터베이스 정규화

    2024. 10. 26. 15:21

    정규화란?

    정규화(Normalization)란 데이터베이스의 데이터 중복과 불일치를 줄이기 위해 데이터 구조를 체계적으로 정리하는 과정

     

    왜하나?

    일관성,무결성을 높여 데이터 삽입, 수정, 삭제 시 발생할 수 있는 여러 문제를 효과적으로 방지하기 위해서

    새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다

     

    정규화의 종류

    제 1정규화(1NF)

    각 테이블의 모든 필드가 원자값(Atomic Value)을 가져야 한다

    즉, 하나의 칸에는 하나의 값만 존재해야 한다

    • 각 컬럼이 하나의 속성만을 가져야한다.
    • 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야한다.
    • 각 컬럼이 유일한 이름을 가져야한다.
    • 칼럼의 순서가 상관없어야한다.

    제 2정규화(2NF)

    두 번째 정규형은 첫 번째 정규형을 만족하면서, 부분 함수 종속을 제거하는 것

    이는 기본 키의 일부에만 종속된 속성을 분리하여 새로운 테이블로 나누는 것을 의미

    이를 통해 데이터 중복을 줄이고 데이터의 일관성을 높일 수 있다

    예)

     

    이건 1형정규형만 한 상태,

    이 테이블은 제2 정규형(2NF)을 만족하지 않음

    StudentName은 StudentID에만 종속되고,

    CourseName과 InstructorName은 CourseID에만 종속되는 부분 종속성이 있기 때문에

    StudentID (기본키 일부) CourseID(기본키 일부) StudentName CourseName InstructorName
    1 C101 John Math Smith
    1 C102 John Science Brown
    2 C101 Alice Math Smith
    2 C103 Alice English Taylor

     

    2형 정규형을 만족하려면 테이블을 아래와 같이 나눠야한다

     

    - 학생 테이블

    StudentID (기본키) StudentName
    1 John
    2 Alice

     

    - course 테이블

    CourseID (기본키) CourseName InstructorName
    C101 Math Smith
    C102 Science Brown
    C103 English Taylor

    - 학생 과목 등록 테이블

    StudentID (기본키) CourseID (기본키)

    1 C101
    1 C102
    2 C101
    2 C103

     

    제 3정규화(3NF)

    세 번째 정규형은 두 번째 정규형을 만족하면서,

    이행적 종속(Transitive Dependency)을 제거하는 것

    즉, 기본 키에 직접적으로 종속되지 않는 속성을 분리하는 과정

     

    아래의 2형정규형만 만족하는 테이블에서 

    EmployeeID (기본키) EmployeeName DepartmentID DepartmentName ManagerName
    1 Alice D001 Sales John
    2 Bob D002 IT Susan
    3 Charlie D001 Sales John
    4 David D003 HR Mary

     

    3형 정규형을 만족하도록 바꾸려면 테이블을 나눠야함

     

    직원테이블

    EmployeeID (기본키) EmployeeNameDepartmentID DepartmentID
    1 Alice D001
    2 Bob D002
    3 Charlie D003
    4 David D004

     

    부서 테이블

    DepartmentID (기본키) DepartmentName ManagerName
    D001 Sales John
    D002 IT Susan
    D003 HR Mary

     

     

    정규화의 한계

    과도한 정규화는 테이블을 지나치게 분리시켜 쿼리 성능을 저하시킬 수 있으며,

    복잡한 join 연산이 필요하게 될 수 있다

    그래서 데이터베이스의 성능을 위해 "비정규화(Denormalization)"를 고려하기도 함

    'programming > database' 카테고리의 다른 글

    데이터베이스 인덱스  (0) 2024.10.26
    데이터베이스 Lock의 종류  (0) 2024.10.26
    디비 데드락  (0) 2024.10.19
    [mongodb] mongoose Index 관련  (0) 2024.01.24
    [mongodb] 간단한 사용법,로그인, 컬랙션,디비관련 명령어  (0) 2023.09.21
      'programming/database' 카테고리의 다른 글
      • 데이터베이스 인덱스
      • 데이터베이스 Lock의 종류
      • 디비 데드락
      • [mongodb] mongoose Index 관련
      worldint
      worldint
      공부한 내용들, 트러블 슈팅, 아티클 번역 등등 올리는 블로그입니다

      티스토리툴바