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) - 코끼리DB (0) | 2024.08.15 |
1일1개 (6) - Index (B+ Tree, Hash Table) (2) | 2024.08.14 |