13.1 비정규란

  • 비정규(Denoramlizaiton)는 데이터를 중복시키거나 그룹핑함으로써 데이터 베이스의 성능을 향상시키기 위한 기법이다.


비정규화

  • 비정규화는 일단 완전하게 정규화된 견고한 모델을 구축하고 나서 수행해야 한다. 그리고 완전한 정규형 모델에 성능을 유발시키는 요건이 존재할때 선택적으로 비정규형을 채택한다.
  • 비정규 과정에는 정규화 과정이 포함된다. 실제로 비정규화를 수행하려면 정규화를 먼저 수행해야한다.
  • 비정규형을 사용하는 유일한 목적은조회 성능을 향상시키기 위해서다. (항상 조회 성능이 향상되는 것은 아니다.)
  • 저자의 생각으론 사용의 편의함에 때문인듯하다.(의식적이든지 무의식이던지 비정규형이 편하다는 생각이 지배적이다.)
  • 비정규화시 중복된 데이터의 정합성이 떨어지므로 정합성을 맞추는 작업이 필요하다.
  • 비정규화를 간단하게 설명하면 데이터 중복을 허용하는것이다.
  • 데이터의 중복을 허용한다는 의미에서 속성을 중복해서 사용한다는 의미와 엔터티를 중복해서 사용한다는 의미가 포함되어있다.
  • 넓은 의미로 추출속성도 중복 속성에 포함되어있다.


속성

  • 추출속성: 기존에 존재하는 속성을 가공해서 생성할수있는 속성이다.
  • 추출속성을 생성하는 원천속성은 주로 하위(자식) 엔터티의 속성이다. 보통 하위(자식) 엔터티의 많은 인스턴스를 읽어서 SUM , COUNT , MAX등의 처리를 한다.
  • 중복속성: 기존에 존재하는 속성을 복사(COPY) 해서 그대로 가져다 놓는 속성이다.
  • 주로 상위 엔터티를 조인(JOIN)하기 싫어서 발생한다. 하지만 이런 중복은 보통 성능에 크게 도움이 되지않는다. 상위(부모) 엔터티와 조인(JOIN)해서 일어도 IO가 나쁘지 않을때가 많다.


비정규화 불필요이유

  • 정규화된 엔터티의 데이터는 서로 분해되 있으므로 다른 블록(BLOCK)에 저장된다.
  • 분해된 데이터를 한번에 조회(쿼리)하는 여건이 있다면 당연히 여러 블록에서 데이터를가져와야 하므로 느릴수 있다.
  • 조회시간을 줄이는것이 비정규화의 사용 목적이지만 데이터베이스가 조회(쿼리)를 하기 위해서만 사용되지 않을뿐더러
  • 조회 조건에 따라 정규형이 빠를수도 있어 무저건 비정규하는 옳지않다.


비정규화 필요한 경우

  • 은행 통장 잔고 같이 추출속성이지만 업무적으로 중요하여 기초속성처럼 쓰는이경우 논리 모델링 초기에서도 도출해야한다.
  • 추출속성과 중복속성은 데이터의 정체성(성격)과 무관하다고 생각해서 물리 모델링 단계에서 도출해야한다.
  • 성능에 도움이 될만하다고 판단되고 그렇게 분석했다면 모델링단계와 무관하게 도출되야한다.
  • 추출 속성을 채택하는것은 때에 따라 의미가 있으며 검토의 여지가 있지만 중복 속성의 경우 얻는것에 비해 잃는 경우가 많다. (데이터 정합성 문제 )


잘못된 비정규화

  • 그림13.1 은 중복 데이터를 사용한 릴레이션이다. 고객이 한 번에 세 개의 상품을 주문했을때의 릴레이션으로
  • 주문일자ㆍ주문총액ㆍ주문자속성의 데이타가 중복됐다. 한번만 존재하면 되는데 세번이나 등장한다.
  • 이 릴레이션은 1정규형을 위반했으므로 정규화 대상이다.


그림 13.1 비정규형 릴레이션


비정규화를 수행하는 방법
  • 정규화의 역작업
  • 중복 속성 채택
  • 추출 속성 채택
  • 요약 엔터티 채택


비정규화 저자의 원칙
  • 최우선적으로 고려할 요소는 데이터의 무결성
  • 정규형은 필수이며 필요(성능 문제 발생)시 비정규형을 채택
  • 중복 속성은 가능한 사용하지 않으면 추출 속성은 채택가능