데이터베이스 지식이 궁금하기도 했고, 목표를 두고 명확한 결과가 있으면 동기부여를 받을 수 있지 않을까 해서 sqld 자격증을 취득했다.
공부를 하면서 5개의 정규화를 더욱 이해할 수 있게 되어 포스팅을 하게 되었다. 정규화는 예시 테이블을 보는게 제일 좋은데, 내가 이해가는 간결한 예시들을 모아놓았다.
각 속성에 하나의 값만 저장한다.
| 학생ID | 이름 | 수강 과목 |
|---|---|---|
| 1 | 김철수 | 수학, 영어 |
| 2 | 이영희 | 과학 |
| 3 | 박지훈 | 영어, 역사, 미술 |
수강과목 칼럼에 여러 값이 포함되어 있다. 그래서 특정 과목 기준으로 검색하기 어려워진다. "영어를 수강하는 학생"을 조회하려면 문자열을 분리하는 작업이 필요하다.
| 학생ID | 이름 | 수강 과목 |
|---|---|---|
| 1 | 김철수 | 수학 |
| 1 | 김철수 | 영어 |
| 2 | 이영희 | 과학 |
| 3 | 박지훈 | 영어 |
| 3 | 박지훈 | 역사 |
| 3 | 박지훈 | 미술 |
수강과목 칼럼은 하나의 값만 가진다. WHERE 수강 과목 = '영어'로 간단히 검색 가능!
엔티티의 모든 일반 속성은, 반드시 주 식별자의 모든 속성들에 부분종속이 아닌 완전 종속을 가져야 한다. (부분 함수 종속성 제거)
제 1 정규화를 만족하는 상태에서, 모든 일반 속성은 주식별자에 완전 함수 종속성을 가져야 한다.
| 학생ID | 과목 | 교수명 | 학점 |
|---|---|---|---|
| 1 | 수학 | 김교수 | A |
| 1 | 영어 | 이교수 | B |
| 2 | 수학 | 김교수 | B |
| 3 | 역사 | 박교수 | A |
주식별자는 학생ID+ 과목이다. 학생ID+ 과목의 값에 따라 다른 학생 이름, 교수명, 강의실이 정해진다.
학점은 학생ID와 과목에 완전 종속되어 있다.
근데 교수명은은 과목에만 종속된다. (부분 함수 종속성 존재)
| 과목 | 교수명 |
|---|---|
| 수학 | 김교수 |
| 영어 | 이교수 |
| 역사 | 박교수 |
교수명이 과목에 종속되므로, 이를 분리한다.| 학생ID | 과목 | 학점 |
|---|---|---|
| 1 | 수학 | A |
| 1 | 영어 | B |
| 2 | 수학 | B |
| 3 | 역사 | A |
학점은 학생ID와 과목에 완전히 종속되므로 그대로 유지.일반 속성들은 주식별자에만 함수적 종속을 가져야 한다. (이행적 함수 종속 제거)
| 학생ID | 학생 이름 | 학과ID | 학과명 |
|---|---|---|---|
| 1 | 홍길동 | 101 | 컴퓨터공학 |
| 2 | 이영희 | 102 | 경영학 |
| 2 | 이영희 | 101 | 컴퓨터공학 |
주식별자는 학생ID이다.
학과ID는 학생ID로 결정된다. 근데 학과명은 학생 ID가 아닌 학과ID가 결정한다
(학생ID → 학과ID → 학과명라는 이행적 종속 발생)
| 학생ID | 학생 이름 |
|---|---|
| 1 | 홍길동 |
| 2 | 이영희 |
| 학생ID | 학과ID |
|---|---|
| 1 | 101 |
| 2 | 102 |
| 2 | 101 |
| 학과ID | 학과명 |
|---|---|
| 101 | 컴퓨터공학 |
| 102 | 경영학 |
하나의 속성이 여러 속성에 영향을 미친다. 근데 그 여러가지 속성들이 독립적이다. (다치 종속성 제거)
| 학생ID | 언어 | 악기 |
|---|---|---|
| 1 | 영어 | 피아노 |
| 1 | 스페인어 | 피아노 |
| 1 | 영어 | 기타 |
| 1 | 스페인어 | 기타 |
| 2 | 중국어 | 바이올린 |
| 2 | 한국어 | 바이올린 |
위 테이블에서는 학생이 여러 언어를 배우고, 여러 악기를 다룬다는 것을 알 수 있다.
근데 학생이 배우는 언어와 학생이 다루는 악기는 서로 독립적인 정보이다. (다치 종속성!)
따라서 중복되는 정보가 많아진다. (학생 1은 영어와 스페인어를 배우지만, 피아노와 기타도 각각 중복적으로 나오고 있다.)
제4정규화를 적용하려면 언어와 악기를 각각 독립적인 테이블로 분리해야 한다.
| 학생ID | 언어 |
|---|---|
| 1 | 영어 |
| 1 | 스페인어 |
| 2 | 중국어 |
| 2 | 한국어 |
| 학생ID | 악기 |
|---|---|
| 1 | 피아노 |
| 1 | 기타 |
| 2 | 바이올린 |
- 데이터를 여러 테이블로 나누는 작업을 통해 중복을 없앤다.
- 나눈 데이터를 필요할 때 조인해서 합쳤을 때도 원래의 정보와 동일하게 복원될 수 있어야 한다.
- 조인을 통해서만 복원 가능한 데이터 구조를 방지한다.
| 학생ID | 과목 | 교수 | 교재 |
|---|---|---|---|
| 1 | 수학 | 김교수 | 수학책 |
| 1 | 영어 | 이교수 | 영어책 |
| 2 | 수학 | 김교수 | 수학책 |
| 3 | 물리 | 박교수 | 물리책 |
예를 들어, "김교수는 항상 수학책 사용"이라는 정보는 과목-교수와 과목-교재 테이블로 충분히 관리됨.
| 학생ID | 과목 |
|---|---|
| 1 | 수학 |
| 1 | 영어 |
| 2 | 수학 |
| 3 | 물리 |
| 과목 | 교수 |
|---|---|
| 수학 | 김교수 |
| 영어 | 이교수 |
| 물리 | 박교수 |
| 과목 | 교재 |
|---|---|
| 수학 | 수학책 |
| 영어 | 영어책 |
| 물리 | 물리책 |
이렇게 테이블을 나누면 각 속성이 독립적으로 저장되고, 이제 데이터를 수정하거나 추가할 때 조인 종속성을 최소화할 수 있다. 예를 들어, 수학 과목에 대한 교수나 교재 정보가 바뀌면 해당 정보를 하나의 테이블만 수정하면 되므로 데이터 일관성을 유지할 수 있다.
정규화된 데이터 구조를 의도적으로 변경하여 성능을 최적화하는 작업
장점
단점