본문 바로가기
  • 시 쓰는 개발자
1일 1개념정리 (24년 8월~)/데이터베이스

1일1개 (23) - 정규화

by poetDeveloper 2024. 9. 1.

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#23. 정규화

정규화는 DB에서 굉장히 중요한 개념이다. 데이터 중복을 최소화하고 효율성을 추구하면서도 일관성을 유지해야해서 공부할 때 되게 헷갈리기도 한 개념이다. 실제로 24년도 1회 정처리 실기 때는 한 문제가 제 몇 정규화인지에 대해서 논란이 많았다. 정규화에 대해 알아봅시다.

 

정규화 단계

제 1 정규형 : 모든 속성이 원자 값을 갖도록 테이블을 설계

테이블의 모든 컬럼이 하나의 값만을 가지도록(원자값=더이상 쪼갤 수 없는 단일값) 설계한다. 이를 통해 중복을 제거하고 모든 행과 열이 고유하게 식별될 수 있도록 한다.

 

1차 정규화 전

학생 과목
홍길동 수학, 과학
김철수 영어

홍길동이 여러 과목을 수강해서 과목 컬럼이 여러 값을 가진다. 원자값을 가져야하므로 이를 분리한다.

 

→ 1차 정규화 후

학생 과목
홍길동 수학
홍길동 과학
김철수 영어

제 2 정규형 : 모든 속성이 기본키에 완전 함수 종속되도록 테이블을 설계

제 2 정규화는 1정규형을 만족시키면서, 기본키가 아닌 속성들이 기본키에 완전 함수 종속되도록 한다. 뭔소리냐면, 기본키의 일부가 아닌 전체에 종속되는 것을 의미한다. 기본키의 일부만으로 값을 결정할 수 있는 속성들이 있으면 분리한다.

참고 ) 종속된다 : 어떤 값이 다른 값에 의해 결정된다는 의미

 

1차 정규화가 된 테이블

학생 ID 과목 교수명 점수
1 수학 김교수 A
1 과학 박교수 B
2 영어 이교수 C

교수명이 과목에 종속되고 학생 ID에는 종속되지 않는다. 이를 학생-과목 / 과목-교수로 분리해야함.

 

→ 분리한 학생-과목 테이블

학생 ID 과목 점수
1 수학 A
1 과학 B
2 영어 C

 

→ 분리한 과목-교수 테이블

과목 교수명
수학 김교수
과학 박교수
영어 이교수

제 3 정규형 : 이행적 종속을 제거하여 테이블을 설계

제 3 정규화는 2정규형을 만족시키면서, 이행적 종속을 제거하는 것이다. 이행적 종속이란 A → B, B → C가 성립할 때 A → C도 성립하는 관계이다. 이를 제거하는 게 제 3 정규화 과정이다. 이를 통해 데이터를 더 독립적으로 관리하게 된다.

 

2차 정규화가 된 테이블

학생 ID 과목 교수명 교수 소속
1 수학 김교수 이과대
1 과학 박교수 이과대
2 영어 이교수 문과대

여기서 교수 소속은 교수명에 종속되어 있는데, 문제는 학생의 ID를 통해서도 구분을 할 수 있다. 즉, 교수명이 아니라 학생 ID로도 구분할 수 있으므로 이를 제거해야한다. ( 이행적 종속 관계 : A → B, B → C가 성립할 때 A → C도 성립하는 관계 )

학생의 ID로 교수명을 알고, 교수명으로 교수 소속을 알 수 있으므로 A → C가 성립한다는 뜻 !!!!

 

 분리한 학생-과목 테이블

학생 ID 과목 교수명
1 수학 김교수
1 과학 박교수
2 영어 이교수

 

 분리한 교수-학부 테이블

교수명 교수 소속
김교수 이과대
박교수 이과대
이교수 문과대

 

정규화의 현실적인 이야기

왜 내가 제 3 정규형까지만 썼을까 ?? 왜냐하면 실무에서도 정규화를 엄격하게 적용하는 것은 아니기 때문이다. 그니까, 정규화 단계가 높아질수록 효율이 좋아지는 건 맞는데, 너무 높아지면 오히려 효율성이 떨어지기도 한다. 정규화 단계가 높아지면 테이블이 더 세세하게 나뉘는데 이렇게 되면 Join 연산이 많아져서 더 복잡해지고 성능이 저하될 수 있다. 그래서 정규화는 보통 제3정규형 까지만 해도 충분하고 실용적이라는 이야기가 많다.

 

비정규화

반대로 정규형 단계를 내리는 "비정규화"라는 것이 있다. 이는 정규형 단계를 내리는 즉 오히려 고의적으로 중복을 허용하는 것이다. 분석이 많은 시스템에서는 쿼리 성능이(대규모 쿼리) 중요해서 불필요한 Join을 줄이는 것이 중요하여 비정규화를 도입하기도 한다.

앞서 언급했듯, 정규화가 많이 된 상태면 테이블이 세분화되어 있어서 Join이 많이 발생한다. 조인 연산은 복잡하고 성능에 영향을 줄 수 있다. 그래서 오히려 데이터 중복을 허용하여 조인 연산을 줄이는 전략을 선택할 수도 있다. 이렇게 하면 조회 속도가 빨라지겠지만, 중복때문에 무결성 유지가 어려워질 수 있기 때문에 비정규화 도입 전에 상황을 잘 고려해봐야한다.

 

비정규화를 하는 이유

  • 성능 최적화 : 대규모 시스템에서 분석이 많은 경우엔 읽기 성능이 중요한 경우가 많다. 그래서 테이블을 비정규화해서 Join을 줄이고 조회 성능을 향상시킨다.
  • 캐시 효율성 : 비정규화를 통해 자주 조회되는 데이터를 하나의 테이블에 모아두면 이 데이터에 접근할 때 캐싱 효율성이 높아진다.

 

'1일 1개념정리 (24년 8월~) > 데이터베이스' 카테고리의 다른 글

1일1개 (30) - Redis  (0) 2024.09.09
1일1개 (26) - 몽고DB  (0) 2024.09.05
1일1개 (13) - Elastic Search  (0) 2024.08.21
1일1개 (7) - PostgreSQL  (0) 2024.08.15
1일1개 (6) - Index (B+ Tree, Hash Table)  (2) 2024.08.14