정규화에 대하여
정규화란 무엇인가
관계형 데이터베이스 모델에서 정규화라는 DB 설계 이론이있습니다.
설계 단계에서 데이터의 중복을 최소화 하기 위해 데이터의 구조를 결정하는 작업입니다.
정규화의 목적
데이터 베이스의 변경시 이상현상 제거
테이블을 수정할때 원하지않는 오류가 발생할수있습니다.
주로 생기는 오류로는 같은정보가 여러개의 행에서 표현되는것입니다.
만약 테이블에서 특정 데이터를 복수의 레코드가 가지고있을때에 우리는 그 데이터를 변경하고자할때 여러개의 레코드를 모두 수정해야합니다.
하지만 성공적인 갱신이 이루어지지 않을경우에 일부의 레코드는 변경되고 일부의 레코드는 변경되지않아 그 특정 데이터의 정확성과 신뢰도에 대해
의심을 품게됩니다. 이 현상을 갱신 이상 이라고 합니다.
또한 특정 데이터는 전혀 기록되지않는 상황이 발생하게됩니다. 이를 삽입 이상 이라고 합니다.
그리고 마지막으로 특정 데이터를 삭제하고자 할떄 그 데이터와 전혀 관련이 없는 데이터의 삭제도 필요로 하는 상황이 생기게 됩니다.
이 상황을 삭제이상 이라고합니다.
이러한 모순들이 생기는 이유는 데이터의 중복이 가장 큰 역할을 하게 됩니다.
우리는 이제 정규화를 통해 이런 모순들을 해결할수있습니다.
이때문에 정규화는 릴레이션 내에서 중복을 제거하는 일련의 과정 이라고 할수있습니다.
정규화는 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말합니다.
이에 해당하는형태는 제 1 정규형, 제 2 정규형 . . . 등이 있습니다.
제 1 정규형 (1NF)
1NF 를 만족하기 위한조건은 릴레이션이여야 한다 입니다
테이블과 릴레이션은 비슷한것 같지만 서로 다른 개념인데,
다음 과정을 통해 테이블은 릴레이션과 같아진다고할수있습니다.
테이블에는 컬럼이나 행이 순서가 존재하지만 릴레이션에는
순서가 존재하지않기때문에 순서를 고려하지않습니다.
NULL 값을 사용할수없습니다.
값은 의미가 있는 묶음 데이터, 원자 단위여야 합니다 (원자성)
원자단위 : 한 행마다 한 컬럼에 하나의 값을 가져야함 (다른 같은값이랑 통합 X)
제 2 정규형 (2NF)
1NF 의 정규형을 만족하면서 테이블에 존재하는 모든 함수의 종속관계가 완전 함수 종속이여야합니다.
완전 함수 종속의 정의는 다음과 같습니다.
어떤 테이블 R의 필드 Y가 필드의 집합 X에 함수 종속이면서, X 자신을 제외한 X의 어떤 부분 집합에도 함수 종속이 아니면, Y는 X에 완전 함수 종속이라고 한다.
완전 함수 종속이 아닌 종속 관계가 존재한다면 2NF 가 아닙니다.
함수 종속이 존재한다면 2NF 는 이러한 함수 종속을 제거하는 작업이라고 할수있습니다.
함수 종속을 제거 하려면 원래의 릴레이션에서 무손실 분해 시켜야합니다.
종속관계가 있는 속성을 추출하여 새로운 릴레이션을 만들고,
원래있던 릴레이션에은 떨어져나간 attribute 를 제외한 상태로 존재하게됩니다.
분해된 릴레이션을 결합했을때 원래의 릴레이션이 된다면 무손실 분해가 이루어졌다고 할수있습니다.
제 3 정규형 (3NF)
3NF는 추이 함수 종속성( Transitive Dependency )을 제거하는 작업입니다.
2NF 의 정의를 만족하면서 어떤 테이블에 존재하는 key 가 아닌 필드들이 서로 독립적일때 3NF 라고 합니다.
종속성을 제거하는 작업에서 2NF 와의 차이는 2NF 는
후보키와 키가 아닌 attribute 사이의 함수 종속성을 제거했다는 점입니다.
슈퍼키를 알면 X 를 알수있고 X 를 알면 Y 도 알수있으므로 추이 함수 종속성이라는 말이 붙었습니다.
보이스코드 정규형 (BCNF)
BCNF는 키가 아닌 애트리뷰트에서 후보키의 진부부집합에 대한 함수 종속성을 제거하는 작업입니다.
어떠한 테이블에 대해 테이블에 존재하는 모든 함수 종속 관계의 determinant가 candidate key이면, BCNF라고 한다.
BCNF는 함수 종속성이 모두 제거된 상태의 정규형입니다.
때문에 BCNF 이상에서 함수 종속성에 의한 무손실 분해는 더이상 할 수없게됩니다.
제 4, 5, 6 정규형 (4,5,6 NF)
BCNF 까지 정규화를 진행하였을때 보통의 경우 5NF 의 조건을 만족하는 경우가 많게됩니다.
그래서 일반적으로 BCNF 까지만 해도 충분하게됩니다.
대부분의 함수 종속성을 해결한 상태이기때문에 더이상 진행할 필요가 없게됩니다.
또한 더 진행을 하게 된다면 릴레이션이 너무나도 많아지기 때문에 불필요한 JOIN 이 많아져 응답시간이 느려질수있는 단점이 존재합니다.
정규화의 장단점
장점
-
데이터 베이스 변경시에 이상현상이 발생할수있는데, 그러한 이슈들을 해결할수있습니다.
-
기존 데이터 베이스의 구조를 확장하고자할때 구조를 변경하지않아도 되거나, 일부만 변경해도 되게 됩니다.
연동된 응용프로그램에 최소한의 영향을 미치게 되어 프로그램의 생명을 연장 시킬수있습니다.
- 사용자에게 데이터 모델을 더 의미있게 제공할수있습니다. 현실세계의 개념을 적용시켜 보다 이해하기 쉽게 반영할수있습니다.
단점
- 많은 릴레이션 분해들을 통해 JOIN 등의 릴레이션 연산이 많아지게됩니다. 그때문에 응답시간이 느려질수있습니다.
정규화를 한다는것은 데이터를 결정하는 결정자에 의해 함수형 종속을 가지고 있는 일반 속성을 의존자로 하여 각종 이상현상을 제거하는것입니다.
데이터의 중복속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 통일 되므로 데이터의 용량이 줄어드는 효과가있습니다.
그렇게 때문에 성능이 좋아질수도, 나빠질수도 있다는 특성이있습니다.
이에 대한 해결책으로는 반정규화(De-normalization, 비정규화) 라는 해결책이 존재합니다.
만약 필요이상으로 엑세스 되는 프로세스 수가 많거나 대량의 데이터를 자주 처리하는경우 반정규화의 대상이 될수있습니다.
언뜻보면 반정규화를 하는것이 좋아보이지만 과도하게 적용할시에 데이터의 무결성이 깨질수있습니다.
또한 입력,수정,삭제 등에 응답시간이 느려질수있습니다.
정리
1. 정규화는 릴레이션 내에서 중복을 제거하는 과정
2. 과도한 정규화는 잦은 JOIN 으로 인한 성능 감소가 생길수도있다.
3. 정규화과정은 불만족스러운 나쁜 릴레이션에서 작고 좋은 릴레이션으로 분해하는 작업.