정규화 비정규화

HunkiKim·2022년 9월 26일
0

Nomalization Denomalization

Nomalization

정규화란 이상 문제를 해결하기 위해 속성들 끼리의 종속 관계를 분석하여 여러개의 릴레이션으로 분해하는 과정이다. 가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것이다. 즉, 제약을 지키는 것이다.

한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다. 또 중복된 정보로 인해 갱신 이상이 발생하개 된다. 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다. 따라서 정규화를 거치는 것이다.

이상 현상

  • 삽입 이상 : 원하지 않는 자료가 삽입되거나, 삽입하는데 자료가 부족해 삽입되지 않아 발생하는 문제이다.
  • 삭제 이상 : 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제이다.
  • 수정(갱신) 이상 : 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제이다.

제 1 정규화 (1NF)

  • 테이블 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것이다.
  • 아래의 규칙을 지켜야 한다.
    • 각 컬럼이 하나의 속성만을 갖는다.
    • 하나의 컬럼은 같은 종류나 타입의 값을 갖는다.
    • 각 컬럼이 유일한 이름을 갖는다
    • 컬럼의 순서가 상관없어야 한다.

예를들어 컬럼이 취미라고 한다면 취미에 (영화, 음악) 과 같이 두 개 이상의 값들을 넣었을 수도 있다. 이를 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것이다. 그러면 취미에는 (영화, 음악)이 아닌 영화 또는 음악만 들어가게 된다.

제 2 정규화 (2NF)

  • 제1 정규화를 진행한 테이블에 대해 모든 컬럼이 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
  • 기본키가 복합키일 때, 기본키의 부분집합 키가 결정자가 되어서는 안된다.
    예를들어 학생번호와 강좌이름이 기본키(복합)라고 할 때 학생번호로 성적을 알고 강좌이름을 가지고 강의실을 안다던가 하면 안된다. 복합된 키를 이용해야만 해당 값을 알 수 있어야 한다. 부분집합을 가지고 해당값을 결정 할 수 있게 되면 부분집합 키인 강좌이름이나 학생번호가 결정자가 된다.

따라서 위와 같이 결정자가 되는 강좌 이름을 분리시킨다. 그렇게 되면 강좌이름 -> 강의실을 가리키는 결정자가 된다. 그리고 본래 테이블에서 강의실을 분리한다.

제 3 정규화 (3NF)

  • 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
  • 이행적 종속 : A -> B, B -> C 이면 A -> C가 성립된다.
    예를들어 학생번호 -> 강좌이름 -> 수강료 이렇게 알 수 있다면 학생번호와 강좌이름 두 가지 모두로 수강료를 알 수 있다. 이럴경우 종속관계가 된다. 이렇게 되면 만약 강좌를 바꾸게 되면 이것에 맞춰 수강료도 강제로 변경해야 된다. 따라서 학생번호-강좌이름과 강좌이름-수강료를 분리하도록 한다.

즉 갑 -> 을 -> 병 같이 종속이 2개이상 생기는 경우를 말한다.

BCNF 정규화 (BCNF)

제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
학생번호와 특강이름이 교수를 결정하고 교수는 특강이름을 결정한다고 하자. 이럴경우 교수는 특강이름의 결정자이다. 하지만 교수는 후보키가 아니다. 즉 튜플을 유일하게 식별할 수 없다. 이럴 경우 학생번호와 교수, 특강이름과 교수로 테이블을 나눈다.

즉 결정자가 아닌 컬럼이 결정자 역할을 할 수 있을 때 분리하라는 것이다.

장점

  1. 데이터베이스 변경 시에 갱신 이상 현상이 감소한다.
  2. 종속성 삭제로 데이터의 일관성과 무결성을 보장한다.
    1. 무결성이란 데이터베이스의 데이터와 구조는 변경된 순서대로 전체 데이터베이스에 적용된다는걸 의미한다. 즉 기능의 의미가 바뀌면 관련된 다른 부분에서도 똑같이 적용되어야 한다.
    2. 일관성이란 사용자가 조회 또는 변경하는 데이터는 그 작업을 마칠 때까지 다른 사용자에 의해서 변경되지 못하게 한다는 것을 의미한다. 구현하는 기능의 의미가 처음 시스템의 목적이 바뀌기 전까지 다른 시스템의 각부에서도 같은 의미여야 한다.
  3. 중복의 최소화로 저장공간을 효율화한다.

DeNomalization

비정규화는 아예 정규화를 수행하지 않은 모델을 지칭할 때 사용한다. 반정규화를 정의하면 정규화된 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발 및 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미한다. 협의의 반정규화는 데이터를 중복하여 성능을 향상시키기 위한 기법이라고 정의할 수 있고 더 넓은 의미의 반정규화는 성능을 향상시키기 위해 정규화된 모델에서 중복, 통합,분리 등을 수행하는 모든 과정을 의미한다.

데이터 무결성이 깨질 수 있는 위험을 감수하고 데이터를 중복하여 반정규화를 적용하는 이유는 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나 컬름을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행한다.

기본적으로 정규화는 입력/수정/삭제에 대한 성능을 향상시킬 뿐 아니라 조회에 대해서도 성능을 향상시킬 수 있다. 하지만 정규화만을 수행하면 엔티티의 갯수가 증가하고 관계가 많아져 일부 여러 개의 조인이 걸려야 데이터를 가져오는 경우가 있다. 이러한 경우 업무적으로 조회의 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다. 또한 정규화의 함수적 종속관계는 위반하지 않지만 데이터의 중복성을 증가시켜야만 데이터 조회의 성능을 향상시키는 경우가 있다. 이럴 때 반정규화를 고려하면 좋다. 반정규화를 적용할때 기술적으로 수행하지 않으면 아래와 같은 문제가 발생한다.

  • 성능이 저하된 DB가 생성될 수 있다.
  • 구축단계나 시험단계에서 반정규화를 적용할 때 수정에 따른 노력비용이 많이 들게 된다.

반정규화의 적용방법

반정규화도 하나의 난이도 높은 데이터 모델링 실무기술이다. 보통 프로젝트에선 칼럼 중복을 통해서만 반정규화를 수행한다. 컬럼의 반정규화가 많은 이유는 SQL문장 작성이 복잡해지고 이에 따라 SQL 단위 성능 저하가 예상되어 단순하기 처리하도록 하기위한 경우가 많다. 이렇게 무분별하게 컬럼의 반정규화를 하면 데이터에 대한 무결성을 깨뜨리는 결정적인 역할을 하는 경우가 많다.

반정규화를 적용할 때는 기본적으로 데이터의 무결성이 깨질 가능성이 많이 있기 때문에 반드시 데이터 무결성을 보장할 수 있는 방법을 고려하고 반정규화를 적용하도록 해야한다.

0개의 댓글