데이터베이스 정규화
데이터를 효율적으로 저장하고 관리하기 위해 데이터를 구조화하는 과정을 말합니다. 정규화를 통해 중복 데이터를 최소화하고 데이터의 일관성과 무결성을 유지할 수 있습니다.
데이터베이스 정규화는 주로 관계형 데이터베이스에서 사용되며, 주로 "제1정규화"부터 "제5정규화"까지 여러 단계로 나뉘어 집니다. 각 정규화 단계는 특정 종류의 데이터 중복을 제거하고 데이터를 분리함으로써 데이터의 논리적 일관성을 보장합니다.
제1정규화(1NF)
데이터베이스 설계에서 첫 번째 단계로서, 데이터베이스 테이블의 열들이 원자적인 값을 가지도록 만드는 과정을 말합니다. 즉, 각 칼럼의 값은 더 이상 분해되거나 나뉘어질 수 없어야 합니다.
조건
모든 컬럼의 도메인은 원자값만을 포함해야합니다. 즉 각 칼럼의 값은 더 이상 나눌 수 없는 최소 단위여야 합니다.
중복된 데이터는 분리되어야 합니다. 특정 데이터 값은 한 번만 저장되어야 하며, 중복 데이터는 허용되지 않습니다.
위의 테이블은 중복된 데이터를 가지고 있으며, 제품명, 고객이름, 고객 전화번호와 같은 컬럼들이 여러 개의 값을 가집니다. 이를 1NF로 변환하려면 중복된 데이터를 분리하고, 각 컬럼이 원자적인 값을 가지도록 해야 합니다.
제2정규화(2NF)
테이블이 제1정규형을 만족하면서 부분 함수 종속성을 제거하는 과정을 의미합니다. 부분 함수 종속성이란 주키에 의존하는 부분 집합에 대한 종속성을 말합니다.
조건
테이블이 제1정규형을 만족해야 합니다.
비주요 속성이 주키에 대해서 완전 함수 종속해야 합니다. 즉 주키의 어떤 부분에도 의존하지 않아야 합니다.
위의 테이블에서 주문 번호와 제품명은 복합 주키입니다. 이 테이블은 제1정규형을 만족하고 있지만, 제품명 컬럼은 부분적으로 주문번호에 종속되어 있습니다. 예를 들어 주문 번호가 1인 경우 제품명이 제품A와 제품B로 중복되며 이 중복은 주문번호의 일부에 의해 결정됩니다.
제3정규화(3NF)
테이블이 제2정규형을 만족하면서 이행 함수 종속성을 제거하는 과정을 말합니다. 이행 함수 종속성은 A->B->C와 같이 한 컬럼이 종속성이 다른 컬럼으로 전파되는 경우를 의미합니다.
조건
테이블이 제2정규형을 만족해야 합니다.
비주요 속성이 주키에 대해 이행적으로 종속되면 안 됩니다.
테이블에서 교수명과 교수 전화번호는 과목명에 종속되며, 이 종속성은 학번을 통해 전파됩니다. 이 경우 학번->교수명->교수 전화번호와 같이 종속성이 전파됩니다.
BCNF
테이블이 제3 정규형을 만족하면서 결정자에 의존하는 모든 함수 종속성을 만족하는 상태를 나타냅니다. BCNF는 릴레이션의 논리적 일관성과 무결성을 보장하기 위해 사용됩니다.
조건
테이블이 제 3정규형을 만족해야 합니다.
모든 결정자는 슈퍼키이어야 합니다.
학번과 과목명이 후보 키가 될 수 있습니다. 그리고 학번 -> 교수 ID와 같은 함수 종속성이 존재합니다. 하지만 교수ID는 과목명에는 종속되지 않습니다. 따라서BCNF를 만족시키기 위해 교수 ID를 과목 정보 테이블과 분리할 수 있습니다.
제4정규화(4NF)
데이터베이스 정규화에서 네번째 단계로, 다치 함수 종속성을 제거하는 과정을 의미합니다. 다치 함수 종속성은 한 테이블의 속성들 간에 복합적인 종속성이 존재하는 경우를 나타냅니다..
조건
테이블이 제 3정규형을 만족해야 합니다.
다치 함수 종속성을 제거합니다. 즉, 모든 다치 함수 종속성이 후보 키에 종속되어야 합니다.
교재 번호와 저자명이 후보키가 될 수 있습니다. 그리고 저자명-> 저자연락처와 같은 다치 함수 종속성이 존재합니다. 이러한 다치 함수 종속성은 한의 저자명에 대해 여러 개의 저자 연락처가 종속되는 것을 의미합니다.
제5정규화(5NF)
조인 종속성을 제거하는 과정을 의미합니다. 조인 종속성은 여러 개의 테이블을 조인하여 얻을 수 있는 정보에 종속되는 상황을 나타냅니다.
조건
테이블이 제4정규형을 만족해야 합니다.
조인 종속성을 제거합니다. 즉,하나의 테이블에서 다른 테이블로의 조인을 통해 얻을 수 있는 정보를 해당 테이블에 저장되어서는 안 됩니다.
학번과 과목번호는 후보키가 될 수 있습니다. 그리고 과목 번호 -> 과목명과 같은 종속성이 존재합니다. 하지만 과목명은 학번에 종속되지 않습니다. 이렇게 되면 학생 과목 테이블을 과목명에 따라 여러 번 조인해야만 과목명을 얻을 수 있게 됩니다.
'BackEnd > 더 깊은 데이터베이스 지식' 카테고리의 다른 글
인덱스와 그 작동원리 (1) | 2023.08.23 |
---|---|
트랜잭션 (0) | 2023.08.19 |
ACID (0) | 2023.08.18 |