일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- data
- 직장생활
- 보울룸
- SQL
- 홈트
- 30일글쓰기
- 책리뷰
- 빅데이터
- rename
- 일기
- null
- SQLD
- constraint
- 전생
- INSERT
- ROWNUM
- 회사생활
- Update
- 인덱스
- 직장인일기
- 회사싫어
- 테이블삭제
- 데이터모델링
- Drop
- 30일챌린지
- 넷플릭스
- 환생
- where절
- 도전
- ERD
- Today
- Total
최보름달
[SQL] 정규화/ 반정규화 본문
정규화
- 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것.
정규화의 특징
- 정규화를 하면 기본적으로 데이터에 대한 중복성을 제거하여 주고 데이터가 관심사별로 처리되는 경우가 많기 때문에 성능이 향상되는 특징이 있다.
- 데이터 중복속성을 제거하므로 데이터 용량이 최소화 되는 효과가 있다.
- 데이터 입력/수정/삭제할 때 처리 성능이 향상된다.
- 물론 엔티티가 계속 발생되므로 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우도 있다.
함수적 종속성(Functional Dependancy)에 근거한 정규화 수행 필요
- 함수적 종속성은 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭하는 것이다.
- '사람' 이라는 엔티티에 주민번호, 이름, 출생지, 호주 라는 속성이 있다고 하자. 여기서 이름, 출생지, 호주 라는 속성은 주민등록번호 속성에 종속된다.
주민등록번호 -> (이름, 출생지, 호주)
즉, "주민등록번호가 이름, 출생지, 호주를 함수적으로 결정한다." 데이터들은 대부분 이런 함수 종속성을 가지고 있다.
- 정규화의 궁극적인 목적은 반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게 배치되도록 하는 것이므로 이 함수의 종속성을 이용하여 적절하게 배치하는 작업에 이용된다.
- 데이터는 속성간의 함수종속성에 근거하여 정규화되어야 한다.
반정규화(역정규화. De-Normalization)
- 정규화를 수행하지 않은 모델링
- 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법.
- 데이터 무결성이 깨질 위험을 무릅쓰고 중복해서 반정규화를 적용하는 이유는, 데이터 조회시 디스크 i/o가 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나, 칼럼을 계산하여 읽을 때 성능이 저하될 것이 예상되기 때문에 적용한다.
- 반정규화 시 데이터 입력, 수정, 삭제할 때 성능이 떨어지게 된다.
반정규화 적용방법
- 반정규화 대상을 조사하고 다른 방법을 적용할 수 있는지 검토한 후에 반정규화를 적용하도록 한다.
반정규화 기법
1. 테이블 반정규화
- 테이블 병합: 1:1관계 테이블 병합, 1:M관계 테이블 병합, 슈퍼/서브타입 테이블 병합
- 테이블 분할: 수직/수평 분할
- 테이블 추가: 중복, 통계, 이력, 부분 테이블 추가
2. 칼럼 반정규화
- 중복 컬럼, 파생 컬럼, 이력테이블 컬럼, PK에 의한 칼럼 추가, 응용시스템 오작동을 위한 칼럼 추가
3. 관계 반정규화
- 중복관계 추가: 추가적인 관계를 맺는 방법.
테이블과 칼럼의 반정규화는 데이터 무결성에 영향을 미치지만, 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 테이터처리의 성능을 향상시킬 수 있는 반정규화 기법이 된다.
* 한국데이터진흥원에서 출간한 SQL 전문가 가이드 2013 Edition을 요약했습니다
'문송한 회사생활 > SQL 공부' 카테고리의 다른 글
[SQL] 슈퍼타입/서브타입 모델 (0) | 2020.07.19 |
---|---|
[SQL] 대량 데이터에 따른 성능 (0) | 2020.07.19 |
[SQL] 성능 데이터 모델링 (0) | 2020.07.19 |
[SQL] 식별자 (Identifiers) (0) | 2020.07.19 |
[SQL] 관계(Relationship) (0) | 2020.07.16 |