정규화
2023. 10. 7. 16:15ㆍBOOKS/SQL 전문가 가이드
1. 제 1정규형
: 모든 속성은 반드시 하나의 값을 가져야 한다.
- 속성이 다중값을 가지는 경우
- 개발의 복잡성 증가
- 속성의 의미 퇴색
- 불안정한 데이터 구조 양산
- 개발의 오류 및 데이터 품질 문제 야기
해결 : 다중값을 가지는 속성을 엔터티로 만들어 준다.
- 중복 데이터를 속성으로 분리한 경우
- 중복되는 데이터 수가 늘어나면 속성을 매번 추가해야 함
→ DBMS에서 테이블 Lock발생 → 사이트 중지 - 중복된 데이터를 분리하여 만든 속성을 빠르게 조회하기 위해서는 인덱스를 추가해야함
→ 조회는 빨라지지만 입력,수정,삭제는 느려짐
해결 : 중복되는 데이터는 새로운 엔터티를 만들어 따로 관리해준다.
2. 제 2정규형
: 엔터티의 일반속성은 주식별자 전체에 종속적이여야 한다.
→ 상품번호가 중복되지만 주문번호가 다르므로 중복된 데이터X
- 상품명은 주문번호에는 종속되지 않으므로 제 2정규형에 위배
→ 문제점- 상품명을 변경해야 하는 경우 중복된 상품명을 모두 변경해야 하므로 상품명의 부하가 크게 증가
- 특정 시점에는 아직 변경되지 않은 상품명 존재
→ 이때 들어온 트랜잭션은 일관되지 않은 데이터 조회 - 정리 : 일반속성이 주식별자 전체에 종속적이지 않으면(= 제 2정규형에 위배되면) 그 속성은 중복이 발생할 수 있으며 중복되는 속성값을 변경해야 할 경우 해당 속성값을 가지는 인스턴스들을 모두 찾아 변경해주어야하고, 변경 도중 새로운 트랜잭션이 들어오면 일관되지 않은 데이터를 조회하게 되므로 성능과 정합성 문제를 발생시킨다.
해결 : 종속되지 않는 일반 속성은 새 엔터티를 만들어 따로 관리해준다.
→ 상품명도 함께 보고 싶을 경우에는 상품번호를 매핑키로 조인하여 조회해준다.
3. 제 3정규형
: 엔터티의 일반 속성 간에는 서로 종속적이지 않는다.
이행 종속성
→ 이행 종속성을 배제하는 것을 제3정규형이라고 한다.
제 3정규형 위배했을 때 문제점
- 고객명이 변경되면 주문엔터티에 고객명을 전부 갱신해야 한다. 이는 주문과는 전혀 연관 없는 트랜잭션이다.
- 데이터 중복으로 인해 발생하는 문제는 성능 부하 및 정합성 오류로 제 2차정규형과 동일
해결 : 고객 엔터티를 분리하여 관리
4. 반정규화와 성능
반정규화
- 정규화를 반대로 하는 것
- 성능을 위해 데이터 중복을 허용하는 것
※ 조회 성능은 향상시킬 수 있으나 입력,수정,삭제 성능은 저하될 수 있다.
반정규화를 적용한 모델에서 성능이 향상될 수 있는 경우
- 많이 쓰이는 속성일 경우 조인 건수가 증가하게 되어 성능이 저하될 수 있음
→ 반정규화하여 개선
반정규화를 적용한 모델에서 성능이 저하될 수 있는 경우
- 인스턴스를 생성할 때 속성값을 결정할 수 없는 경우 속성값이 결정된 후 갱신해주어야 함
→ 불필요한 로직이 추가됨
반정규화는 데이터 불일치로 인한 정합성 문제 뿐만 아니라 불필요한 트랜잭션으로 인한 성능 문제를 만들어내기 때문에 꼭 필요할 때만 적용해야함
'BOOKS > SQL 전문가 가이드' 카테고리의 다른 글
모델이 표현하는 트랜잭션의 이해 (0) | 2023.10.07 |
---|---|
관계와 조인의 이해 (0) | 2023.10.07 |
식별자 (0) | 2023.10.07 |
관계 (0) | 2023.10.07 |
속성 (0) | 2023.09.29 |