끄적이는 메모장

[DB] 데이터베이스 정규화 본문

웹기술 개발자 되기/DB기술

[DB] 데이터베이스 정규화

밥보92 2020. 4. 17. 23:32
반응형

데이터베이스에 데이터를 아무렇게 막 저장하면 어떤 일이 일어날까

만약 학교에서 학생 데이터를 이렇게 저장한다면?

 

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 인천

 

 

참고

https://3months.tistory.com/193

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94

반응형

'웹기술 개발자 되기 > DB기술' 카테고리의 다른 글

[DB] 트랜잭션(Transaction)  (0) 2020.04.15
[DB] 파티셔닝(Partitioning)  (0) 2020.04.14
[DB] Index란  (0) 2020.04.14