DB 정규화와 실무

dropKick·2023년 6월 18일
0

스터디

목록 보기
15/20

목표

  • DB 정규화의 개념을 이해한다.
  • 제1 정규화부터 BCNF 정규화까지의 개념을 이해한다.
  • 실무에서 적용 가능한 정규화의 수준을 알아본다.

DB 정규화

정규화의 개념과 목적

  • 개념: 데이터베이스 설계에서 중복을 최소화하고 데이터의 일관성, 효율성, 유지보수성을 향상시키기 위한 과정
  • 목적: 데이터의 구조를 최적화하여 삽입, 갱신, 삭제 작업을 효율적으로 수행하고 데이터 일관성을 유지하는 것

정규화의 장점과 단점

장점

  • 데이터 중복 최소화: 정규화는 중복된 데이터를 제거하므로 데이터 일관성을 향상
  • 데이터 일관성 유지: 정규화는 데이터의 종속성을 명확히 정의하여 일관성을 유지
  • 효율적인 데이터 조작: 정규화된 데이터 구조는 삽입, 갱신, 삭제 작업을 효율적으로 수행할 수 있음

단점

  • 데이터 구조 복잡성: 정규화로 인해 데이터 구조가 복잡해질 수 있으며, 쿼리의 복잡성도 증가할 수 있음
  • 조인 연산 비용: 정규화로 인해 테이블 간의 조인 연산이 필요해질 수 있으며, 이로 인해 성능 저하가 발생할 수 있음

정규화 수준에 따른 데이터 구조 변화

정규화는 총 4가지 수준에 따라 데이터 구조를 변화시킬 수 있으며, 각 1 정규화, 2 정규화, 3 정규화, BCNF 정규화로 칭함

  • 1NF: 반복되는 속성을 제거하고, 각 속성은 원자 값으로 구성
  • 2NF: 부분 함수 종속성을 제거하고, 키에 대해서만 완전 함수 종속성을 가지도록 분해
  • 3NF: 이행적 함수 종속성을 제거하고, 비키 속성 간의 함수 종속성을 최소화
  • BCNF: 결정자 종속성을 이용하여 모든 함수 종속성을 최소화

제1 정규화 (1NF)

제1 정규화의 개념과 목적

개념

  • 데이터베이스의 테이블을 정규화하는 과정 중 첫 번째 단계
  • 테이블의 속성들을 원자적인 값을 갖도록 분해하는 작업을 수행, 이를 통해 테이블의 중복을 최소화하고 데이터의 일관성과 유연성을 향상

목적

  • 각 속성은 원자적인 값을 갖도록 분해하여 데이터 중복을 최소화
  • 데이터의 일관성과 정확성을 유지하기 위해 각 속성은 독립적으로 관리
  • 테이블 구조를 단순화하여 데이터 조작과 쿼리 수행에 용이
  • 데이터의 무결성을 보장하기 위해 중복된 정보를 제거

제1 정규화 규칙과 예제

규칙

  • 각 속성은 원자적인 값을 갖도록 분해
  • 각 테이블은 고유한 기본 키(primary key)를 소유해야 함
  • 중복된 데이터는 별도의 테이블로 분리하여 참조(referencing) 관계를 형성

예제

Order 테이블

  • 주문번호 (OrderID)
  • 고객명 (CustomerName)
  • 제품명 (ProductName)
  • 수량 (Quantity)
OrderID    CustomerName    ProductName            Quantity
----------------------------------------------------------
1          John Smith      Apple iPhone 12         2
2          Mary Johnson    Samsung Galaxy S21      1
3          John Smith      Apple AirPods Pro       3

PK를 소유하고, 각 속성을 분해하는 1 정규화 수행

Order

OrderID    CustomerName
-----------------------
1          John Smith
2          Mary Johnson
3          John Smith

Product

OrderID    ProductName          Quantity
---------------------------------------
1          Apple iPhone 12       2
2          Samsung Galaxy S21    1
3          Apple AirPods Pro     3

제2 정규화 (2NF)

제2 정규화의 개념과 목적

개념

  • 제2 정규화(Second Normal Form, 2NF)는 데이터베이스의 테이블을 더 나은 구조로 재정의하는 과정

목적

  • 중복 데이터를 제거하고 데이터의 의미적 관련성을 확립하여 데이터를 보다 효율적으로 관리

제2 정규화 규칙과 예제

규칙

  • 테이블의 모든 비주요 속성이 주요 속성에 대해 완전 함수적 종속
  • 부분적 종속을 갖는 속성을 별도의 테이블로 분리하여 중복을 제거

완전 함수 종속과 부분적 종속

완전 함수 종속(Fully Functional Dependency)
  • 테이블의 모든 비주요 속성이 주요 식별자에 대해 함수적으로 종속되는 것을 의미
  • 어떤 테이블의 주요 식별자 값이 변경되면 비주요 속성들의 값도 변해야 함
부분적 종속(Partial Dependency)
  • 테이블의 비주요 속성 중 일부가 주요 식별자에 대해 종속되는 것을 의미
  • 비주요 속성 중 일부는 주요 식별자가 아닌 다른 비주요 속성에도 종속되는 경우

제1 정규화 예제로 보는 완전 함수 종속과 부분적 종속

Order

OrderID    CustomerName    ProductName            Quantity    ProductCategory
----------------------------------------------------------------------------
1          John Smith      Apple iPhone 12         2          Smartphones
2          Mary Johnson    Samsung Galaxy S21      1          Smartphones
3          John Smith      Apple AirPods Pro       3   
  • 각 주문은 PK로 OrderId를 소유
  • 제 1정규화의 적용
    • 완전 함수 종속: OrderID -> {CustomerName, ProductName, Quantity, ProductCategory}
    • 부분적 종속: OrderID -> {CustomerName}, OrderID -> {ProductName, Quantity, ProductCategory}

Order

OrderID    CustomerName
-----------------------
1          John Smith
2          Mary Johnson
3          John Smith

Product

ProductName            ProductCategory
-------------------------------------
Apple iPhone 12         Smartphones
Samsung Galaxy S21      Smartphones
Apple AirPods Pro       Headphones
  • OrderId에 대한 완전 함수 족송성은 유지

제3 정규화 (3NF)

제3 정규화의 개념과 목적

  • 테이블의 속성들 간에 이행적 함수 종속(transitive functional dependency)을 제거하여 데이터 구조를 정규화하는 과정

제3 정규화 규칙과 예제

규칙

  • 제3 정규형에 속하는 모든 속성은 기본 키에 대해서만 이행적으로 함수적 종속
  • 이행적 함수 종속을 갖는 속성은 별도의 테이블로 분리

예제

Order

+---------+-------------+------------+-------------+-------+-----+
| OrderID | CustomerName | OrderDate  | ProductName | Price | ... |
+---------+-------------+------------+-------------+-------+-----+
|    1    |     John    | 2022-05-01 |    Shirt    |  20   | ... |
|    2    |     Mary    | 2022-05-02 |    Shoes    |  50   | ... |
+---------+-------------+------------+-------------+-------+-----+
  • 제 2 정규화 적용으로 인한 테이블 분리
Order 테이블
+---------+-------------+------------+
| OrderID | CustomerName | OrderDate  |
+---------+-------------+------------+
|    1    |     John    | 2022-05-01 |
|    2    |     Mary    | 2022-05-02 |
+---------+-------------+------------+

Product 테이블
+-------------+-------------+-------+-----+
| ProductName | Manufacturer | Price | ... |
+-------------+-------------+-------+-----+
|    Shirt    |   Brand A   |  20   | ... |
|    Shoes    |   Brand B   |  50   | ... |
+-------------+-------------+-------+-----+
  • 제 3 정규화 적용으로 제품 카테고리와 제조사를 Category 테이블로 생성
Order 테이블
+---------+-------------+------------+-------------+
| OrderID | CustomerName | OrderDate  | ProductName |
+---------+-------------+------------+-------------+
|    1    |     John    | 2022-05-01 |    Shirt    |
|    2    |     Mary    | 2022-05-02 |    Shoes    |
+---------+-------------+------------+-------------+

Product 테이블
+-------------+-------------+-------+-----+
| ProductName | Manufacturer | Price | ... |
+-------------+-------------+-------+-----+
|    Shirt    |   Brand A   |  20   | ... |
|    Shoes    |   Brand B   |  50   | ... |
+-------------+-------------+-------+-----+

Category 테이블
+-------------+
|  Category   |
+-------------+
|  Clothing   |
|  Footwear   |
+-------------+

왜 Category 테이블 분리가 제 3정규화를 만족할까?

  • 이행 함수 종속은 A → B, B → C라는 종속 관계에서 A → C라는 종속 관계가 성립하는 것을 의미
  • 중간에 있는 B를 통해 A가 C에 종속되는 상황
Product 테이블에서 CategoryName이 ProductName에 종속되는 경우
Product 테이블
+-------------+-------------+-------+-----+
| ProductName | Manufacturer | Price | ... |
+-------------+-------------+-------+-----+
|    Shirt    |   Brand A   |  20   | ... |
|    Shoes    |   Brand B   |  50   | ... |
+-------------+-------------+-------+-----+
  • ProductName은 CategoryName을 통해 결정되고, CategoryName은 Category 테이블에서 결정
  • ProductName에 대한 조회나 변경 시 CategoryName이 필요, 이 경우 CategoryName의 변경이나 추가가 있을 경우 모든 관련된 Product 행을 업데이트 해야 함
  • 따라서, 이행 함수 종속을 제거하기 위해 Category 테이블을 분리하여 Product 테이블과의 직접적인 종속 관계를 형성

BCNF (Boyce-Codd 정규화)

BCNF의 개념과 목적

  • BCNF는 함수 종속성과 결정자의 개념을 기반으로 데이터의 중복성과 종속성을 제거

BCNF 규칙과 예제

규칙

  • 모든 결정자는 후보 키여야 한다.
  • 비 식별자 키 속성은 다른 비 식별자 키 속성에 종속되지 않아야함

예제

Students

Students (StudentID, StudentName, CourseCode, CourseName)
  • 학생들과 각각 수강 과목에 대한 정보를 담고 있는 테이블의 경우, 수강 과목 코드에 수강 과목 이름이 종속
  • 이 경우 비 식별자 키는 다른 비 식별자 속성에 종속되지 않아야하기 때문에 분리

BCNF 적용

Students (StudentID, StudentName)
Courses (CourseCode, CourseName)
  • 모든 결정자가 후보키가 되고, 종속이 사라지는 BCNF 정정규화를 적용

정규화 수준 선택과 실무 적용

정규화 수준 선택 기준

  • 결국 모든 것은 시간과 비용, 비즈니스 요구사항과 확장을 고려
  • 정규화가 많아지면 데이터의 조작이 복잡해지고 유지보수가 어려워짐

실무에서 적용 가능한 정규화 수준

  • 일반적인 비즈니스의 경우 제3 정규화까지 적용

정규화와 성능 및 유지보수 측면 고려 사항

  • 정규화된 데이터는 데이터의 일관성과 중복 최소화에 대한 도움을 줌
  • 하지만 성능 문제 발생 시 관계에 의한 JOIN연산 등을 고려해야 함
  • 정규화된 데이터 구조는 유지보수 시 복잡성을 증가시킴

비정규화 데이터 경험

재밌게도 나는 실무에서 비정규화된 데이터와 정규화된 데이터 시스템 두 가지를 전부 다루고 있는데 정규화 데이터가 아닌 비정규화 데이터에 대한 소감은 다음과 같음

비정규화 데이터

  • 한 테이블에 비즈니스에 필요한 모든 속성이 들어가 있어서 조회 하고 쿼리 짤 때 굉장히 편함. 대부분의 조건 거는 것만으로 처리됨
  • 장점
    • 데이터 간의 관계를 신경쓰지 않고 데이터를 다룰 수 있음
    • 도메인을 몰라도 테이블 구성을 알 수 있음
  • 단점
    • 별도로 데이터를 수정과 삭제할 수 없는 이상 현상을 마주함
    • 데이터를 삭제할 수 없어 수정하는 경우도 있고, 데이터 삭제 시 다른 데이터도 삭제되는 경우도 있음
    • 그래서 데이터의 수정/갱신/삭제 시 굉장히 불편함

0개의 댓글