일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- coalesce
- show graph characteristics
- SQL
- GROUPING
- 정규식 연산
- html
- searched case expression
- python
- list multiplication
- 뷰
- Node.js
- dense rank
- 비절차적 데이터 조작어
- SQLD
- execute immediate
- sql 저장 모듈
- ROLLUP
- MYSQL
- 자료구조
- window 함수
- JavaScript
- 정보처리기사
- 문법 차이
- simple case expression
- Oracle
- 코드 스니펫
- 기업 협업
- git
- 위코드
- dom
- Today
- Total
프로그래밍 숲
정규화 과정이란? 제1정규형, 제2정규형, 제3정규형, BCNF 본문
정규화 과정이란
정규화는 데이터 중복을 제거하고 데이터 일관성, 정확성 및 무결성을 개선하기 위해 데이터베이스에서 데이터를 구성하고 구조화하는 프로세스입니다. 정규형에는 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는 테이블의 키가 아닌 모든 속성이 후보 키의 하위 집합이 아닌 전체 후보 키에 종속되도록 보장하는 더 높은 수준의 정규화입니다. 이는 데이터 이상 및 중복성을 제거하고 데이터베이스를 보다 효율적이고 유지 관리하기 쉽게 만듭니다.
'프로그래밍_인포 > 데이터베이스&SQL' 카테고리의 다른 글
VARCHAR vs VARCHAR2: Oracle 데이터베이스에서 문자열 데이터 유형 선택하기 (0) | 2023.05.31 |
---|---|
HAVING 절과 EXISTS 연산자가 있는 복잡한 SQL문 분석해보기 (0) | 2023.05.30 |
체크 제약조건(Check Constraint)의 정의와 예시 (0) | 2023.05.30 |
SQL 명령어 DCL(GRANT, REVOKE) & TCL(COMMIT, ROLLBACK) 예시 (0) | 2023.05.29 |
DBMS 문자 필드 타입 (MySQL) (0) | 2023.05.12 |