정규화
- 관계형 데이터베이스의 설계에서 중복을 최소화하게 구조화하는 프로세스를 정규화라고 한다.
- 중복을 제거, 한 곳에서만 데이터를 관리 -> 데이터를 변경할 때 한번에 전부 바꿀 수 있음 (하지만 항상 원본데이터를 참조해야함)
- 테이블 설계관점에서 조회와 쓰기 사이의 트레이드 오프
정규화 | 반정규화(비) |
중복을 제거하고 한 곳에서 관리 | 중복을 허용 |
데이터 정합성 유지가 쉬움 | 데이터 정합성 유지가 어려움 |
읽기시 참조 발생 | 참조없이 읽기 가능 |
데이터 정합성(Data Consistency)
- 어떤 데이터들이 값이 서로 일치하는 상태를 의미한다.
실무에서 정규화시 고려해야 하는 점
- 상황에 따라 읽기vs쓰기에 따라 정규화필요성이 달라짐
- 얼마나 빠르게 데이터의 최신성을 보장해야 하는가?
- 히스토리성 데이터는 오히려 정규화를 하지 않아야 한다.
- 데이터 변경주기와 조회 주기는 어떻게 되는가? -> 읽기 vs 쓰기 (테이블을 나누면 읽기에는 유리하지만 쓰기에는 불리하다.(값이 같이 변경되어야 하기에 다수의 쿼리))
- 객체(테이블)탐색 깊이가 얼마나 깊은가?
아래의 경우 D를 참조하려고 할 때 그냥은 너무 깊은 탐색(무거운 조인발생가능성)을 가지고 있어 B에서 바로 D를 참조할 수 있게 해 읽기에 이점을 가져온다. 하지만 C의 D참조가 바뀌경우 B의 D참조도 바뀌어야 하기에 계속 최신화해줘야한다 -> 쓰기에 불리
- 닉네임변경사항을 기록하는 테이블 -> 최신화가 되면 안된다. -> 정규화X
- 팔로우 테이블 -> PK를 id로 해야하나?닉네임으로 해야하나 -> id로해야함 닉네임은 바뀔 수 있다 -> id로 처리를 하고 유저테이블에서 닉네임을 가져와야함 -> 정규화
정규화시 데이터를 어떻게 가지고(읽기) 와야 하는지
- 테이블 조인을 많이 활용하지만, 고민해보아야 하는 문제이다.
테이블 조인은 서로 다른 테이블의 결합도를 엄청나게 높힌다. - 조회시에는 성능이 좋은 별도 데이터베이스나 캐싱들 다양한 최적화 기법을 이용할 수 있다.
조인을 사용하게 되면, 이런 기법들을 사용하는데 제한이 있거나 더 많은 리소스가 들 수 있다. - 읽기 쿼리 한번 더 발생되는 것은 그렇게 큰 부담이 아닐 수도 있다.
'Computer Science > 데이터베이스' 카테고리의 다른 글
인덱스(요약) (0) | 2023.06.03 |
---|---|
데이터베이스의 성능 (0) | 2023.06.03 |
MySQL (0) | 2023.06.01 |
oracle 실습환경 구축 (0) | 2023.05.30 |
UML 기호 (0) | 2023.04.16 |