Normalization & Denormalization

정규화와 비정규화

정규화(Normalization)

  • 데이터베이스 설계 기술로, 테이블을 조직하여 중복과 의존성을 최소화한다.

  • 데이터베이스를 두 개 이상의 테이블로 나누고 그들 사이의 관계를 정의하는 것을 포함한다.

  • 정규화의 목적은 데이터 중복과 insertion, update, deletion anomaly를 최소화하기 위해 일련의 normal forms(NF)에 따라 관계형 데이터베이스를 구성하고 데이터 무결성을 향상시키는 데 있다.

단계

제1정규화(1NF)

  • 모든 필드의 값은 원자적이어야 하며, 더 이상 분할되지 않는 단일 값을 가져야 한다.

  • 각 필드에는 하나의 값만 있어야 하며, 테이블의 모든 열은 유일한 데이터 타입을 가져야 한다

제2정규화(2NF)

  • 1차 정규화를 만족하며, 모든 비주요 속성이 기본 키에 완전히 함수적으로 의존해야 한다.

  • 부분적 의존성을 제거해야 한다

제3정규화(3NF)

  • 제2정규화를 만족하며, 모든 비주요 속성이 기본 키에만 의존해야 한다.

  • 즉 이행적 의존성을 제거하여 데이터 중복을 더욱 줄여야 한다

제4정규화(BCNF)

  • 제3정규화를 만족하며,멀티밸류드 종속성(multi-valued dependency)을 제거한다.

  • 한 속성이 다른 속성에 대해 두 개 이상의 독립적인 값을 가질 떄 발생한다

예시

  • 비정규화된 테이블 (제 1 정규화 위반):

    • 여러 값이 하나의 필드에 저장되어 있어 1NF를 위반한다.

학생ID
이름
과목명
교수ID
교수
등록금
등록금Level
위치

1

홍길동

컴퓨터,수학

1,2

김교수, 이교수

350,250

5,3

서울,경기도

2

전우치

물리

2

이교수

300

4

경기도

  • 제 1 정규화 (1NF):

    • 각 필드에 하나의 값만 있도록 테이블을 분리한다.

학생ID
이름
과목명
교수ID
교수
등록금
등록금Level
위치

1

홍길동

컴퓨터

1

김교수

350

5

서울

1

홍길동

수학

2

이교수

250

3

경기도

2

전우치

물리

2

이교수

300

4

경기도

  • 제 2 정규화 (2NF):

    • 학생ID와 과목명, 교수ID를 기본 키로 사용하고, 학생ID에 부분적으로 의존하는 이름을 별도의 테이블로 분리한다.

학생ID
이름

1

홍길동

2

전우치

교수ID
교수

1

김교수

2

이교수

학생ID
과목명
교수ID
등록금
등록금Level
위치

1

컴퓨터

1

350

5

서울

1

수학

2

250

3

경기도

2

물리

2

300

4

경기도

  • 제 3 정규화 (3NF):

    • 과목명,교슈ID를 기본 키로 사용하고,기본키가 등록금Level을 결정하고,등록금Level이 등록금을 결정하므로, 등록금Level과 등록금을 별도의 테이블로 분리한다.

학생ID
과목명
교수ID
등록금Level
위치

1

컴퓨터

1

5

서울

1

수학

2

3

경기도

2

물리

2

4

경기도

등록금Level
등록금

5

350

4

300

3

250

  • 제 4 정규화(4NF):

    • 멀티밸류드 종속성을 제거하여, 과목과 위치 정보를 별도의 테이블로 분리한다

학생ID
과목명
교수ID
등록금Level

1

컴퓨터

1

5

1

수학

2

3

2

물리

2

4

과목명
위치

컴퓨터

서울

수학

경기도

물리

경기동

비정규화(Denormalization)

  • 특히 읽기 중심의 작업에서 성능을 향상시키기 위해 의도적으로 데이터베이스에 중복 데이터를 추가하는 과정이다.

  • 이는 테이블을 결합하거나 쿼리에서 조인의 필요성을 중리기 위해 테이블 내에 중복 데이터를 추가하는 것을 포함할 수 있다.

  • 비정규화는 쿼리 성능이 중요한 데이터 웨어하우징아니 빅 데이터 애플리케이션에서 자주 사용한다

정규화 와 비정규화 trade off

정규화의 장단점

장점

  • 데이터 중복 감소

    • 중복 데이터의 저장을 최소화하여 데이터 무결성과 저장 공간 효율성을 높인다.

  • 데이터 관리 용이성

    • 데이터 무결성 증가로 인해 오류 발생 가능성이 줄어들고, 데이터 관리가 용이해진다.

단점

  • 쿼리 성능 저하

    • 데이터가 여러 테이블에 분산되어 있어 조인이 많이지면 쿼리의 복잡성과 시스템 성능이 저하될 수 있다.

비정규화의 장단점

장점

  • 쿼리 성능 향상

    • 데이터가 여러 테이블에 분산되어 있어 조인이 많아지면 쿼리의 복잡성과 시스템 성능이 저하될 수 있다.

단점

  • 데이터 중복 증가

    • 데이터의 중복이 증가하여 데이터 무결성 유지가 어려워진다.

  • 데이터 무결성 유지 어려움

    • 중복된 데이터가 여러 곳에 퍼져 있어 무결성을 유지하기 위한 노력이 필요한다.

정규화시 고려사항

데이터의 최신성 요구도

  • 데이터가 얼마나 빠르게 최신 상태를 유지해야 하는지 고려해야 한다.

히스토리성 데이터 처리

  • 히스토리성이 강한 데이터는 정규화하지 않는 것이 바람직할 수 있다.

데이터 변경 및 조회 주기

  • 데이터의 변경 주기와 조회 주기를 고려해야 한다.

객체(테이블) 탐색 깊이

  • 객체 간의 관계와 탐색 깊이를 고려해야 한다.

정규화를 선택한 경우의 고려사항

읽기 전략

  • 테이블 조인은 테이블 간 결합도를 높이므로, 성능이 좋은 별도의 데이터베이스 사용이나 캐싱 등의 최적화 기법을 고려해야 한다.

조인의 영향

  • 조인 사용은 최적화 기법 적용에 제한을 줄 수 있으며, 리소스 사용 증가를 야기할 수 있다.

읽기 쿼리 부담

  • 추가적인 읽기 쿼리 발생은 큰 부담이 아닐 수 있다.

추가 개념

Functional dependency(FD)

  • 테이블 내의 두속성 집합 간의 관계를 나타낸다.

  • 한 속성 집합 X가 다른 속성 집합 Y에 함수적으로 결정한다는 것은 X의 값에 따라 Y의 값이 유일하게 결정됨을 의미한다.

    • 이 경우 Y는 X에 함수적으로 의존한다.

  • 테이블의 스키마를 보고 의미적으로 파악해야 한다. 즉 테이블의 state를 보고 FD를 파악해서는 안된다.

  • X -> Y는 Y가 X에 종속되지만, 반대는 성립하지 않는다.

Trivial FD

  • Y가 X의 부분집할 일 때

  • 예: {A, B} → {B}

Non-trivial FD

  • Y가 X의 부분집합이 아닐 때

  • 예: {A} → {B}

Completely non-trivial FD

  • X와 Y가 완전히 독립적일 때

  • 예: {A} → {B, C}

Partial FD

  • X의 부분집합이 Y를 결정할 때

  • 예: {A, B} → {C}, 여기서 {A} 또는 {B}만으로 C를 결정할 수 있음

Full FD

  • X의 모든 부분집합이 Y를 결정하지 못할 떄

  • 예: {A, B} → {C}, 여기서 {A}와 {B} 모두 필요

Transitive FD

  • X->Y,Y->Z의 경우, X->Z가 성립할 때

  • 예: {A} → {B}, {B} → {C}, 따라서 {A} → {C}

Super Key

  • 테이블에서 각 튜플을 유일하게 식별할 수 있는 속성들의 집합니다.

  • 슈퍼 키는 필요 이상의 정보를 포함할 수 있다.

Candidate Key

  • 슈퍼 키 중에서 최소성을 만족하는 키

  • 즉 키를 구성하는 어떠한 속성도 제거할 수 없는 최소한의 속성들로 구성된다.

  • 이러한 키들 중 어느 하나가 주 키(Primary Key)로 선택될 수 있다.

Primary Key

  • 후보 키들 주에서 선택된 주 키

  • 이 키는 각 튜블을 유일하게 식별하는 데 사용되며, NULL 값을 가질 수 없고, 각 튜플마다 고유한 값을 가져야 한다.

Prime Attribute

  • 후보 키에 속하지 않은 속성

  • 이 속성들은 테이블의 각 튜블을 구별하는데 중요한 역할을 한다.

Non-Prime Attribute

  • 후보 키에 속하지 않은 속성

  • 이 속성들은 테이블의 기본 키에 직접적으로 의존하지 않다.

Last updated

Was this helpful?