프로그래밍 숲

정규화 과정이란? 제1정규형, 제2정규형, 제3정규형, BCNF 본문

프로그래밍_인포/데이터베이스&SQL

정규화 과정이란? 제1정규형, 제2정규형, 제3정규형, BCNF

jjscript 2023. 5. 14. 14:31
728x90
반응형

정규화 과정이란

정규화는 데이터 중복을 제거하고 데이터 일관성, 정확성 및 무결성을 개선하기 위해 데이터베이스에서 데이터를 구성하고 구조화하는 프로세스입니다. 정규형에는 1NF(1차 정규형), 2NF(2차 정규형), 3NF(3차 정규형) 및 BCNF(Boyce-Codd 정규형) 및 4NF(4차 정규형)와 같은 상위 정규화를 포함하여 여러 수준의 정규화가 있습니다. 이 글에서는 이러한 각 정규 형식과 정규화 프로세스에서의 의미에 대해 설명해 보도록 하겠습니다.

제1 정규형(1NF)

1NF(제1 정규형)는 정규화의 가장 기본적인 수준입니다. 테이블의 각 열에는 원자(분할할 수 없는) 값이 포함되어야 합니다. 즉, 열에 여러 값이나 값 목록이 포함되어서는 안 됩니다. 반복되는 데이터 그룹을 개별 테이블로 분리하면 됩니다.

 

예를 들어 다음 열이 있는 "Employees"라는 테이블이 있다고 가정해 봅시다.

|  직원 ID  |   이름   |    스택    |
|----------|--------|-----------|
|    1     |  김철수  |  자바, C#  |
|    2     |  홍길동  |  C++, SQL |

이 테이블에서 "스택" 열은 쉼표로 구분된 여러 값을 포함하기 때문에 1NF를 위반합니다. 테이블을 1NF로 가져오려면 다음과 같이 "스택" 열을 별도의 테이블로 분리해야 합니다.

| 직원 ID |   이름  |
|--------|--------|
|   1    | 김철수  |
|   2    | 홍길동  |
| 직원 ID  |  스택  |
|---------|-------|
|   1     |  자바  |
|   1     |  C#   |
|   2     |  C++  |
|   2     |  SQL  |

"스택" 열을 별도의 테이블로 분리하여 반복되는 데이터 그룹을 제거하고 1NF를 달성했습니다.

제2 정규형(2NF)

2NF(제2 정규형)는 테이블이 제 1정규형이고 기본키가 아닌 속성이 기본키에 완전 함수 종속일 때 제 2정규형이라고 합니다. 릴레이션의 기본키가 복합키일 때, 복합키의 일부분이 다른 속성의 결정자인지 여부를 판단하는 것입니다.

 

완전 함수 종속(full functional dependency)

A와 B가 릴레이션 R의 속성이고 A → B 종속성이 성립할 때, B가 A의 속성 전체에 함수 종속하고 부분 집합 속성에 함수 종속하지 않을 경우 완전 함수 종속이라고 합니다.

 

예를 들어 다음 칼럼이 있는 "Orders"라는 테이블이 있다고 가정해 봅시다.

+----------+---------+---------+-------+---------+
|  주문 ID  | 고객 ID  |  제품 ID |  수량  |  가격(원) |
+----------+---------+---------+-------+---------+
|    1     |   101   |   001   |   2   | 10,000  |
|    2     |   102   |   002   |   3   | 15,000  |
|    3     |   101   |   003   |   1   |  5,000  |
+----------+---------+---------+-------+---------+

이 테이블에서 기본 키는 "주문 ID" 및 "제품 ID" 칼럼으로 복합적으로 구성됩니다. 그러나 "가격" 칼럼은 전체 기본 키에 기능적으로 종속되지 않고 "제품 ID" 칼럼에만 종속됩니다. 테이블을 2NF로 가져오려면 다음과 같이 "가격" 칼럼을 별도의 테이블로 분리해야 합니다.

+----------+---------+---------+-------+
|  주문 ID  |  고객 ID |  제품 ID  |  수량  |
+----------+---------+---------+-------+
|    1     |   101   |   001   |   2   |
|    2     |   102   |   002   |   3   |
|    3     |   101   |   003   |   1   |
+----------+---------+---------+-------+
+---------+---------+
|  제품 ID |  가격(원) |
+---------+---------+
|   001   | 10,000  |
|   002   | 15,000  |
|   003   |  5,000  |
+---------+---------+

제3 정규형(3NF)

제3 정규형(3NF)은 테이블의 키가 아닌, 각 칼럼이 키가 아닌 다른 열과 독립적이어야 하므로 제2 정규형을 기반으로 합니다. 속성들이 이행적(transitive)으로 종속되어 있는지 여부를 판단하는 것입니다. 릴레이션 R이 제 2정규형이고 기본키가 아닌 속성이 기본키에 비이행적(non-transitive)으로 종속할 때(직접 종속) 제 3정규형이라고 합니다. 이행정 종속이란 A → B, B → C가 성립할 때 A → C가 성립되는 함수 종ㅇ속성을 말합니다.

 

예를 들어 다음 열이 있는 "Sales"라는 테이블이 있다고 가정해 봅시다.

|  판매 ID |  제품명 |   카테고리 |  공급업체  |  공급업체 국가  |   가격  |  수량 |
|---------|-------|----------|----------|--------------|-------|------|
|   1     |  아이폰 |  전자제품  |    애플   |     미국      |  1000  |  10 |
|   2     |  갤럭시 |  전자제품  |    삼성   |     한국      |   800  |  5  |
|   3     |  티셔츠 |   의류    |    자라   |    스페인     |   20   |  50 |

이 테이블에서 "공급업체 국가" 열은 "공급업체" 열에 종속되며 둘 다 기본 키의 일부가 아닙니다. 테이블을 3NF로 가져오려면 다음과 같이 "공급업체 국가" 열을 "공급업체" 열과 관련된 별도의 테이블로 분리해야 합니다.

| 판매 ID  |  제품명  |   카테고리  |  공급업체  |  가격   |  수량  |
|---------|--------|-----------|----------|-------|-------|
|   1     |  아이폰  |   전자제품  |   애플    | 1000  |   10  |
|   2     |  갤럭시  |   전자제품  |   삼성    |  800  |   5   |
|   3     |  티셔츠  |    의류    |   자라    |  20   |   50  |
|  공급업체  |   공급업체 국가  |
|----------|--------------|
|   애플    |     미국      |
|   삼성    |     한국      |
|   자라    |    스페인      |

"공급업체 국가" 열을 별도의 테이블로 분리하여 전이 종속성을 제거하고 3NF를 달성했습니다.

 

보이스/코드 정규형(BCNF)

BCNF(Boyce-Codd 정규형)는 테이블의 모든 결정자가 후보키 상태인 제3 정규형을 기반으로 하는 더 높은 수준의 정규화입니다. 릴레이션 R에서 함수 종속성 X → Y가 성립할 때 모든 결정자 X가 후보키이면 BCNF 정규형이라고 합니다.

 

예를 들어 다음 열이 있는 "Customers"라는 테이블이 있다고 가정합니다.

|  고객 ID |  이름  |           이메일         |  주문 ID |   주문 날짜   |  주문 합계  |
|---------|-------|------------------------|---------|-------------|----------|
|  101    | 김철수 | kimcheolsoo@example.com |    1    | 2023-05-10  |   100    |
|  102    | 홍길동 | honggildong@example.com |    2    | 2023-05-11  |   200    |
|  103    | 아무개 | amoogae@example.com     |    3    | 2023-05-12  |   300    |

 

이 테이블에서 기본 키는 "고객 ID"이고 "주문 ID" 열은 기능적으로 "고객 ID" 열에 종속됩니다. 그러나 "주문 ID" 열은 후보 키이기도 합니다. 즉, 테이블의 다른 열 값을 결정합니다. 테이블을 BCNF로 가져오려면 다음과 같이 "주문 ID" 열을 "고객 ID" 열과 관련된 별도의 테이블로 분리해야 합니다.

|  고객 ID |  이름  |           이메일         |
|---------|-------|------------------------|
|  101    | 김철수 | kimcheolsoo@example.com |
|  102    | 홍길동 | honggildong@example.com |
|  103    | 아무개 | amoogae@example.com     |
|  고객 ID |  주문 ID |   주문 날짜   |  주문 합계  |
|---------|---------|-------------|----------|
|   101   |    1    | 2023-05-10  |   100    |
|   102   |    2    | 2023-05-11  |   200    |
|   103   |    3    | 2023-05-12  |   300    |

위 예에서 "고객 ID" 열은 "이름", "이메일" 열의 결정자이며 "고객 ID" 및 "주문 ID" 열은 " 주문 날짜" 및 "주문 합계" 열의 결정자입니다. 테이블을 두 개로 분할하여 각 결정자가 후보 키이므로 테이블은 BCNF에 있습니다.

 

요약하면 BCNF는 테이블의 키가 아닌 모든 속성이 후보 키의 하위 집합이 아닌 전체 후보 키에 종속되도록 보장하는 더 높은 수준의 정규화입니다. 이는 데이터 이상 및 중복성을 제거하고 데이터베이스를 보다 효율적이고 유지 관리하기 쉽게 만듭니다.

728x90
반응형
Comments