일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- kotlin spring
- Java
- kotlin querydsl
- AWS EKS
- 오블완
- CKA 기출문제
- CloudWatch
- 공부
- AI
- kotlin coroutine
- APM
- 정보처리기사실기 기출문제
- 티스토리챌린지
- Kubernetes
- 정보처리기사 실기
- CKA
- Elasticsearch
- Spring
- PETERICA
- 코틀린 코루틴의 정석
- aws
- kotlin
- 기록으로 실력을 쌓자
- IntelliJ
- minikube
- Linux
- mysql 튜닝
- 정보처리기사 실기 기출문제
- MySQL
- Pinpoint
- Today
- Total
피터의 개발이야기
[Database] 정규화(Normalizatio)란? 본문
ㅁ 들어가며
정규화에 대해서 이론적 설명과 더불어 현실적인 이해를 돕기 위해 정리를 해 보았다.
정리하지 않으면,
- 빠르게 찾을 수가 없다.
- 수량을 확인하기 어렵다.
- 비슷하거나 같은 옷을 또 살 수 있다.
빨래가 섞여있으면 자신의 옷을 쉽게 찾을 수 없기 마련이다. 빠르게 찾기 위해서는 자신의 옷은 자신의 서랍에 정리해야한다.
ㅁ 비 정규화 데이터
이름 | 학생번호 | 강좌 | 동호회 |
안유진 | 101 | 데이터베이스, 자료구조 | 합창단, 방송댄스 |
강호동 | 102 | 데이터베이스, 씨름 | 먹방동호회 |
유재석 | 103 | 사회학, 인문학 | 토크동호회 |
ㅇ 아직 정리 되지 않은 옷이 있다고 가정해 보자.
ㅇ 한 개인의 여러 정보들을 하나의 이름에 정리하면 비정규화된 데이터가 된다.
ㅇ 이런 경우 정리가 되지 않아 데이터의 검색, 삽입, 수정, 삭제시에 이상이 발생하기 마련이다.
ㅇ 쉽게 이야기해 옷정리를 하려고 해도 정리가 되어 있지 않아 그냥 쑤셔넣게 되고, 찾으려고 해도 찾을 수가 없다.
ㅁ 제1 정규화 - 모든 속성 값이 원자값을 갖는 경우
제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
쉽게 설명하면, 옷을 갤 때에 두 개를 한번에 묶어서 개지 않는다.
학생번호 | 강좌 |
101 | 데이터베이스 |
101 | 자료구조 |
102 | 데이터베이스 |
102 | 씨름 |
103 | 사회학 |
103 | 인문학 |
ㅁ 제2 정규화 - 부분적 함수 종속 제거
제2 정규화란 부분적 함수 종속 제거하여 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
ㅇ 완전 함수 종속: 수강정보 = 학생 + 강좌
ㄴ 수강 정보는 학생과 강좌가 키이다.
ㅇ 부분 함수 종속: 수장정보 = 학생 + (강좌 + 강의실)
ㅇ 강좌와 강의실를 분리하여 완전 함수로 만든다.
[수강 정보]
학생번호 | 강좌 | 강의실 |
101 | 데이터베이스 | 소공학과101 |
101 | 자료구조 | 소공학과102 |
102 | 데이터베이스 | 소공학과101 |
102 | 씨름 | 씨름장1 |
103 | 사회학 | 인문과101 |
103 | 인문학 | 인문과102 |
[강의실 정보]
강좌 | 강의실 |
데이터베이스 | 소공학과101 |
자료구조 | 소공학과102 |
씨름 | 씨름장1 |
사회학 | 인문과101 |
인문학 | 인문과102 |
SELECT 학생번호, 수강정보.강좌,강의실정보.강의실
FROM 수강정보
JOIN ON 수강정보.강좌 = 강의실정보.강좌
ㅁ 제3 정규화 - 이행 종속 제거
ㅇ 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.
ㅇ 여기서 이행적 종속이란,
ㄴ A→B, B→C가 성립할 때 A→C가 성립되는 함수 종속성을 의미
학생번호 | 강좌 | 수강료 |
101 | 데이터베이스 | 50000 |
101 | 자료구조 | 30000 |
102 | 데이터베이스 | 50000 |
102 | 씨름 | 25000 |
103 | 사회학 | 10000 |
103 | 인문학 | 15000 |
ㅇ 이 표에서 학생번호 → 강좌 → 수강료
ㅇ 이행 종속을 분리하여 학생 번호와 강좌를 참조하여 수강료를 조인할 수 있도록 변경한다.
ㅁ BCNF 정규화
BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
[특강정보]
학생번호 | 강좌 | 교수 |
101 | 데이터베이스 | 데이터교수1 |
101 | 자료구조 | 자료교수 |
102 | 데이터베이스 | 데이터교수2 |
102 | 씨름 | 씨름교수 |
ㅇ 모든 결정자가 후보키 집합에 속해야 한다는 것은 후보키 집합에 컬럼이 없는 칼럼이 결정자가 되어서는 안된다는 뜻이다.
ㅇ 위 테이블에서 기본키는 학생번호와 강좌이다. 하지만 데이터베이스는 교수가 둘이다.
ㄴ 이렇게 되면 강좌를 알면 교수를 기본키로 검색이 가능하지만, 교수를 통해 강좌를 검색할 수 없다.
ㄴ 이런 경우 후보키 집합이 아닌 칼럼이 결정자가 되어 BCNF를 만족하지 않는다.
ㅇ 교수가 기본키로 구성하기 위해 분해를 하였다.
ㅁ 마무리
ㅇ 데이터의 컬럼에 원자값을 보장하고, 테이블에 부분적으로 살발된 공통 정보를 제1정규화를 통해 데이터를 공통으로 통합하여 저장 데이터를 줄일 수 있었다. 막상 정규화를 공부하면서 데이터를 빠르게 검색하고 관리하기 쉽게 테이블을 쪼개는 과정이 다 담겨져 있었다. 이번 이해를 바탕으로 데이터 설계에 정규화 방식을 잘 적용하여 빠르고 경제적인 데이터설계를 이룰 수 있을 것 같다.
ㅁ 함께 보면 좋은 사이트
ㅇ [Database] 7. 정규화(Normalization)
ㅇ [Database] 정규화(Normalization) 쉽게 이해하기
ㅇ [DB] 정규화(Normalization)란? 정규화 예시, 1NF, 2NF, 3NF, BCNF
'Database' 카테고리의 다른 글
Spring Data JPA와 ProxySQL의 읽기/쓰기 분리 방법 비교 (0) | 2024.10.09 |
---|---|
ProxySQL이란 (0) | 2024.10.09 |
[DBeaver] 필수 단축키 (0) | 2024.02.08 |
[DB] SQL 연습을 위한 실습 사이트 (1) | 2023.07.29 |
[QUERYDSL] 수십억건에서 QUERYDSL 사용하기, 이동욱님 영상을 보고서... (0) | 2023.07.02 |