/ CS

cs - Database Normalization

CS 스터디 공부 목록

Database - Normalization

데이터베이스 정규화에 대해서 설명해 보세요.

정규화 란

  • 데이터베이스 정규화(Database Normalization)는 관계형 데이터베이스에서 중복 데이터를 최소화하고 데이터 구조를 효율적으로 설계하기 위한 과정입니다.
  • 정규화를 통해 데이터베이스의 무결성, 일관성 및 유지 관리가 용이해집니다.
  • 정규화는 여러 단계로 나뉘며, 이를 정규 형태(Normal Forms)라고 부릅니다.
  • 주요 정규 형태로는 제1정규형(1NF), 제2정규형(2NF), 제3정규형(3NF), BCNF(Boyce-Codd Normal Form) 등이 있습니다.
  • 가장 많이 쓰이는 형태는 제1정규형과 제2정규형, 제3정규형, BCNF까지라고 볼 수 있습니다.

정규화의 장점

  • 데이터베이스 변경 시 이상 현상(Anomaly)를 제거할 수 있다.
  • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않거나 일부만 변경하여 사용한다.

정규화의 단점

  • 데이터베이스 정규화는 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있습니다.
  • 그러나 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아져서 질의에 대한 응답 시간이 느려질 수도 있습니다.
  • 만약 조인이 많이 발생하여 성능 저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있습니다

1. 제1정규형(1NF)

  • 제1정규형은 테이블의 모든 컬럼이 원자 값(Atomic Value)을 가져야 하며, 중복되는 값이 없도록 하는 것입니다.
  • 이를 통해 테이블의 각 행이 고유한 키(Primary Key)를 갖게 되어 데이터 중복을 줄입니다.

규칙

  1. 각 컬럼이 하나의 속성만을 가져야 한다.
  2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
  3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
  4. 컬럼의 순서가 상관이 없어야 한다.
  • 1NF가 필요한 테이블
학생번호 이름 과목
101 아이유 운영체제,DB
102 한지민 자바
103 임수정 C, C++
규칙 만족/불만족
각 컬럼이 하나의 속성만을 가져야 한다. 불만족
하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다. 만족
각 컬럼이 유일한(unique) 이름을 가져야 한다. 만족
컬럼의 순서가 상관이 없어야 한다. 만족
  • 1NF를 적용한 테이블
학생번호 이름 과목
101 아이유 운영체제
101 아이유 DB
102 한지민 자바
103 임수정 C
103 임수정 C++
규칙 만족/불만족
각 컬럼이 하나의 속성만을 가져야 한다. 만족
하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다. 만족
각 컬럼이 유일한(unique) 이름을 가져야 한다. 만족
컬럼의 순서가 상관이 없어야 한다. 만족

2. 제2정규형(2NF)

  • 제2정규형은 제1정규형을 만족한 상태에서 부분적 함수 종속(Partial Functional Dependency)을 제거하는 것입니다.
  • 부분적 함수 종속은 기본 키가 복합키인 경우, 일부 속성이 기본 키의 일부 속성에만 종속되어 있는 상황을 말합니다.
  • 이를 해결하기 위해 테이블을 분리하여 중복을 제거하고 무결성을 유지합니다.

규칙

  1. 1정규형을 만족해야 한다.
  2. 모든 컬럼이 부분적 종속이 없어야 한다.(즉, 모든 컬럼이 완전 함수 종속을 만족해야 한다.)
  • 2NF이 필요한 테이블
학생번호 과목 지도교수 성적
101 운영체제 김운체 100
101 DB 조디비 60
102 자바 박자바 70
103 C 김씨 80
103 C++ 이씨플 90
규칙 만족/불만족
1정규형을 만족해야 한다. 만족
모든 컬럼이 부분적 종속이 없어야 한다. 불만족
  • 2NF을 적용한 테이블

<성적테이블 & 과목테이블>

학생번호 과목 성적 과목 지도교수
101 운영체제 100 운영체제 김운체
101 DB 60 DB 조디비
102 자바 70 자바 박자바
103 C 80 C 김씨
103 C++ 90 c++ 이씨플
규칙 만족/불만족
1정규형을 만족해야 한다. 만족
모든 컬럼이 부분적 종속이 없어야 한다. 만족

2NF 적용 효과

  1. 2정규화를 진행하면 이와 같이 테이블을 둘로 나눌 수 있게 됩니다.
  2. 성적테이블과 과목테이블로 나누어서 데이터를 관리하게 되면 변경사항이 발생했을 때에 해당 테이블의 데이터만 수정하는 것이 가능해집니다.

3. 제3정규형(3NF)

  • 제3정규형은 제2정규형을 만족한 상태에서 이행적 함수 종속(Transitive Functional Dependency)을 제거하는 것입니다.
  • 이행적 함수 종속은 한 속성이 다른 속성에 간접적으로 종속되어 있는 상황을 말합니다.
  • 이를 해결하기 위해 간접적으로 종속된 속성을 독립된 테이블로 분리하여 중복을 제거하고 무결성을 유지합니다.

규칙

  1. 2정규형을 만족해야 한다.
  2. 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.
  • 3NF이 필요한 테이블
ID 등급 할인율
101 Vip 40%
102 Gold 20%
103 Bronze 10%
규칙 만족/불만족
2정규형을 만족해야 한다. 만족
기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다. 불만족
  • 3NF을 적용한 테이블

<ID테이블 & 등급테이블>

ID 등급 등급 할인율
101 Vip Vip 40%
102 Gold Gold 20%
103 Bronze Bronze 10%
규칙 만족/불만족
2정규형을 만족해야 한다. 만족
기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다. 만족

3NF 적용 효과

  1. 3정규화를 진행하면 이와 같이 2개의 테이블로 분리해서 관리할 수 있습니다.
  2. 기존 하나의 테이블에 중복해서 들어가야 했던 속성인 할인율은 등급테이블에서 별도로 관리하고 대신 ID테이블에 등급을 외래키(Foreign Key)로 설정해서 부서테이블과 Join해서 사용할 수 있도록 합니다.

4. BCNF (Boyce-Codd Normal Form)

  • BCNF는 제3정규형을 만족한 상태에서 추가로 모든 결정자(Determinant)가 후보키(Candidate Key)가 되도록 하는 것입니다.
  • 이를 통해 테이블에서 발생할 수 있는 함수 종속 관계가 후보키에만 의존하도록 만들어 데이터베이스의 무결성과 일관성을 향상시킵니다.

규칙

  1. 3정규형을 만족해야 한다.
  2. 모든 결정자가 후보키 집합에 속해야 한다.
  • BCNF적용이 필요한 테이블
학생번호 과목 지도교수
101 자바 김자바
101 C++ 박플플
102 자바 오자바
102 C# 조씨샵
103 자바 김자바
규칙 만족/불만족
3정규형을 만족해야 한다. 만족
모든 결정자가 후보키 집합에 속해야 한다. 불만족
  • BCNF적용한 테이블
학생번호 지도교수 지도교수 과목
101 김자바 김자바 자바
101 박플플 박플플 C++
102 오자바 오자바 자바
103 조씨샵 조씨샵 C#
104 김자바    
규칙 만족/불만족
3정규형을 만족해야 한다. 만족
모든 결정자가 후보키 집합에 속해야 한다. 만족

정규화 과정을 통해 데이터베이스의 중복을 줄이고 무결성을 높일 수 있지만 너무 많은 정규화는 데이터베이스의 성능과 복잡도에 영향을 줄 수 있습니다.

이로 인해 여러 테이블 간의 조인 연산이 많아지거나 데이터 처리 시간이 증가할 수 있습니다.

따라서, 정규화의 단계를 선택할 때는 데이터베이스의 목적, 사용 패턴, 성능 요구 사항 등을 고려하여 적절한 균형을 찾아야 합니다.

이를 위해, 실제 구현 시에는 3NF 또는 BCNF까지 정규화를 수행하고, 필요에 따라 일부 비정규화를 적용하기도 합니다.

5. 반정규화

  • 고의적으로 3정규화를 진행하지 않고 데이터베이스를 설계하는 것을 반정규화라고 부르는데, 위의 3정규화 예시에서 살펴본 3정규화가 이루어지지 않은 경우에 해당하는 테이블이 그대로 사용되는 것입니다

참고자료