일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 400에러
- 마드리드
- 코틀린
- 아펠가모선릉
- Kotlin
- db index
- 바르셀로나
- @Component
- 아펠가모 선릉
- HTTP #웹기술
- b-tree index
- 코틀린 함수
- http상태코드
- 아펠가모
- 관심지향프로그래밍
- 본식후기
- Srping AOP
- HTTP
- git명령어
- elk
- 코프링
- c# scv
- kotiln
- sprintboot
- 세비야
- 스페인
- kopring
- 스페인 준비물
- 스프링 AOP
- 그라나다
- Today
- Total
끄적이는 메모장
[DB] 데이터베이스 정규화 본문
데이터베이스에 데이터를 아무렇게 막 저장하면 어떤 일이 일어날까
만약 학교에서 학생 데이터를 이렇게 저장한다면?
1) 출결 데이터
번호 | 이름 | 전화번호 |
1 | 김철수 | 111-222-3333 |
2 | 김영희 | 111-222-3456 |
2) 성적 데이터
번호 | 이름 | 성적 | 전화번호 |
1 | 김철수 | A | 111-222-3333 |
2 | 김영희 | B | 111-222-3456 |
철수의 전화번호를 바꾸기 위해 두 테이블을 모두 수정해야 하는 불편함이 있고
실수로 인해 출결 데이터의 데이터만 수정함으로써 데이터의 무결성이 깨질 수 있음
정규화란?
- 하나의 테이블에서의 데이터 삽입, 삭제, 변경이 정의된 관계들로 인해 데이터베이스의 나머지 부분으로 전파되는 것
- 불피요하게 중복된 데이터를 없애고 데이터 변경 시 발생할 수 있는 이상 현상을 제거하는 것이 목적
정규화의 과정은 6차 정규화까지 있지만 대체로 3차 정규화를 만족하면 정규화가 된 것으로 봄
제1차 정규화 (1NF)
- 반복되는 속성의 칼럼을 만들지 말자
예시) 전화 번호 1,2,3 칼럼은 동일한 속성인데 반복됨, 누군가의 전화 번호가 네 개라면 전화 번호 4 컬럼을 만들것인가?
번호 | 이름 | 전화 번호 1 | 전화 번호 2 | 전화 번화 3 |
- 각 컬럼이 원자값을 갖고 있도록 하자
예시) 김철수의 전화 번호가 두 개인 것을 하나의 컬럼에 저장하지 말자
번호 | 이름 | 전화 번호 |
1 | 김철수 | 111-222-333, 222-333-444 |
즉 1차 정규화를 한다면 아래와 같이 테이블을 구성해볼 수 있음
하지만 redundancy가 증가함
번호 | 이름 | 전화 번호 | 지역코드 | 지역명 |
1 | 김철수 | 111-222-333 | 1 | 서울 |
2 | 김철수 | 222-333-444 | 1 | 서울 |
3 | 김영희 | 333-444-555 | 2 | 인천 |
4 | 김영희 | 444-555-666 | 2 | 인천 |
제2차 정규화 (2NF)
- 테이블의 모든 컬럼이 완전 함수적 종속성을 만족해야 함
# 함수적 종속
관계 R의 속성인 A,B에 대해 A의 값을 알면 B를 바로 식별 가능하며 A(결정자)의 값에 의해 B(종속자)의 값이 달라지는 경우 A->B로 표현하며 이를 B는 A의 함수적 종속이라 함
# 완전 함수적 종속
종속자가 기본키에만 종속이 되는 경우이며, 기본키가 여러 속성의 집합인 경우 하나의 속성에 의해서만 종속자가 결정되지 않는 것을 의미. 즉 {A1, A2} -> B인 경우 B가 A1에 의해서만 결정될 수 있으면 이는 부분 함수적 종속인 것임
위의 테이블에서 전화번호를 결정 하는 것은 {번호,} -> {전화 번호}이므로 번호 하나만으로 전화 번호를 구분 가능하기 때문에 전화 번호 테이블과 이름 테이블로 나눌 수 있음
번호 | 전화 번호 |
1 | 111-222-333 |
2 | 222-333-444 |
3 | 333-444-555 |
4 | 444-555-666 |
번호 | 이름 | 지역코드 | 지역명 |
1 | 김철수 | 1 | 서울 |
2 | 김철수 | 1 | 서울 |
3 | 김영희 | 2 | 인천 |
4 | 김영희 | 2 | 인천 |
제3차 정규화 (3NF)
- 제2차 정규화까지 이루어진 상태에서 기본키에 의존하지 않는 속성을 제거함
위의 테이블에서 지역명은 지역코드에 의존성을 가지기 때문에 이를 제거하는 방향으로 테이블이 나누어져야함
번호 | 이름 | 지역코드 |
1 | 김철수 | 1 |
2 | 김철수 | 1 |
3 | 김영희 | 2 |
4 | 김영희 | 2 |
지역코드 | 지역명 |
1 | 서울 |
2 | 인천 |
참고
'웹기술 개발자 되기 > DB기술' 카테고리의 다른 글
[DB] 트랜잭션(Transaction) (0) | 2020.04.15 |
---|---|
[DB] 파티셔닝(Partitioning) (0) | 2020.04.14 |
[DB] Index란 (0) | 2020.04.14 |