📌 정규화란 함수적 종속성 등의 종속성 이론을 이용하여 잘못 설계된 관계형 스키마를 더 작은 속성의 세트로 쪼개어 바람직한 스키마로 만들어 가는 과정이다.
하나의 종속성이 하나의 릴레이션에 표현될 수 있도록 분해해가는 과정이라 할 수 있다.
정규형에는 제1정규형, 제2정규형, 제3정규형, BCNF형, 제4정규형, 제5정규형이 있으며, 차수가 높아질수록 만족시켜야 할 제약 조건이 늘어난다.
정규화는 데이터베이스의 논리적 설계 단계에서 수행한다.
정규화는 논리적 처리 및 품질에 큰 영향을 미친다.
정규화된 데이터 모델은 일관성, 정확성, 단순성, 비중복성, 안정성 등을 보장한다.
정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다.
정규화의 목적
데이터 구조의 안정성 및 무결성을 유지한다.
어떠한 릴레이션이라도 데이터베이스 내에서 표현 가능하게 만든다.
효과적인 검색 알고리즘을 생성할 수 있다.
데이터 중복을 배제하여 이상(Anomaly)의 발생 방지 및 자료 저장 공간의 최소화가 가능하다.
데이터 삽입 시 릴레이션을 재구성할 필요성을 줄인다.
데이터 모형의 단순화가 가능하다.
속성의 배열 상태 검증이 가능하다.
개체와 속성의 누락 여부 확인이 가능하다.
자료 검색과 추출의 효율성을 추구한다.
이상(Anomaly)의 개념 및 종류
📌 정규화를 거치지 않으면 데이터베이스 내에 데이터들이 불필요하게 중복되어 릴레이션 조작 시 예기치 못한 곤란한 현상이 발생하는데, 이를 이상(Anomaly)이라 하며 삽입 이상, 삭제 이상, 갱신 이상이 있다.
삽입 이상(Insertion Anomaly) : 릴레이션에 데이터를 삽입할 때 의도와는 상관없이 원하지 않은 값들도 함께 삽입되는 현상이다.
삭제 이상(Deletion Anomaly) : 릴레이션에서 한 튜플을 삭제할 때 의도와는 상관없는 값들도 함께 삭제되는 연쇄가 일어나는 현상이다.
갱신 이상(Update Anomaly) : 릴레이션에서 튜플에 있는 속성값을 갱신할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상이다.
정규화의 원칙
정보의 무손실 표현, 즉 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있어서는 안 된다.
분리의 원칙, 즉 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜 표현해야 한다.
데이터의 중복성이 감소되어야 한다.
정규화 과정
1NF(제1정규형)
1NF는 릴레이션에 속한 모든 도메인(Domain)이 원자 값(Atomic Value)만으로 되어 있는 정규형이다. 즉, 릴레이션의 모든 속성 값이 원자 값으로만 되어 있는 정규형이다.
릴레이션의 모든 속성이 단순 영역에서 정의된다.
2NF(제2정규형)
2NF는 릴레이션 R이 1NF이고, 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형이다.
함수적 종속 / 완전 / 부분 함수적 종속 및 이해
함수적 종속(Functional Dependency)
함수적 종속은 데이터들이 어떤 기준값에 의해 종속되는 것을 의미한다.
예를 들어 <수강> 릴레이션이 (학번, 이름, 과목명)으로 되어 있을 때, '학번'이 결정되면 '과목명'에 상관없이 '학번'에는 항상 같은 '이름'이 대응된다. '학번'에 따라 '이름'이 결정 될 때 '이름'을 '학번'에 함수 종속적이라고 하며 '학번 → 이름'과 같이 쓴다.
완전 함수적 종속
어떤 테이블 R에서 속성 A가 다른 속성 집합 B전체에 대해 함수적 종속이지만 속성 집합 B의 어떠한 진 부분 집합 C(즉, C ⊂ B)에는 함수적 종속이 아닐 때 속성 A는 속성 집합 B에 완전 함수적 종속이라고 한다.
부분 함수적 종속
어떤 테이블 R에서 속성 A가 다른 속성 집합 B 전체에 대해 함수적 종속이면서 속성 집합 B의 어떠한 진 부분 집합에도 함수적 종속일 때, 속성 A는 속성 집합 B에 부분 함수적 종속이라고 한다.
함수적 종속 / 완전 / 부분 함수적 종속 및 이해
완전 / 부분 함수적 종속의 이해
완전 함수적 종속은 어떤 속성이 기본키에 대해 완전히 종속적일 때를 말한다.
예를 들어 <수강> 릴레이션이 (학번, 과목명, 성적, 학년)으로 되어 있고 (학번, 과목명)이 기본키일 때, '성적'은 '학번'과 '과목명'에 의해서만 결정되므로 '성적'은 기본키(학번, 과목명)에 완전 함수적 종속이 되는 것이다.
반면에 '학년'은 '과목명'에 관계없이 '학번'이 같으면 항상 같은 '학년'이 온다. 즉 기본키의 일부인 '학번'에 의해서 '학년'이 결정되므로 '학년'은 부분 함수적 종속이라고 한다.
3NF(제3정규형)
3NF는 릴레이션 R이 2NF이고, 기본키가 아닌 모든 속성이 기본키에 대해 이행적 종속을 만족하지 않는 정규형이다.
무손실 조인 또는 종속성 보존을 저해하지 않고도 항상 3NF 설계를 얻을 수 있다.
💡 이행적 종속(Transitive Dependency) 관계 : A → B 이고 B → C 일 때 A → C를 만족하는 관계를 의미한다.
BCNF(Boyce-Codd 정규형)
BCNF는 릴레이션 R에서 결정자가 모두 후보키(Candidate Key)인 정규형이다.
3NF에서 후보키가 여러 개 존재하고 서로 중첩되는 경우에 적용하는, 강한 제3정규형 이라고도 한다.
모든 BCNF(Boyce-Codd Normal Form)가 종속성을 보존하는 것은 아니다.
BCNF의 제약 조건
키가 아닌 모든 속성은 키에 대하여 완전 종속해야 한다.
키가 아닌 모든 속성은 그 자신이 부분적으로 들어가 있지 않은 모든 키에 대하여 완전 종속 해야 한다.
어떤 속성도 키가 아닌 속성에 대해서는 완전 종속할 수 없다.
💡 결정자/종속자 : 결정자(Determinant)는 속성 간의 종속성을 규명할 때 기준이 되는 값이고, 종속자(Dependent)는 결정자의 값에 의해 정해지는 값을 의미한다. 🔔 예) '학번'에 따라 '이름'이 결정되는 '학번 → 이름'일 때 '학번'을 결정자라고, '이름'을 종속자라 한다.
4NF(제4정규형)
4NF는 릴레이션 R에 다치 종속 A → B가 성립하는 경우 R의 모든 속성이 A에 함수적 종속 관계를 만족하는 정규형이다.
5NF(제5정규형, PJ/NF)
5NF는 릴레이션 R의 모든 조인 종속이 R의 후보키를 통해서만 성립되는 정규형이다.
💡 다치 종속(Multi Valued Dependency, 다가 종속) : A, B, C 3개의 속성을 가진 릴레이션 R에서 어떤 복합 속성(A, C)에 대응하는 B값의 집합이 A값에만 종속되고 C값에는 무관하면, B는 A에 다치 종속이라 하고 'A → B' 로 표기한다. 💡 조인 종속(Join Dependency) : 어떤 릴레이션의 R의 속성에 대한 부분집합 A, B ..., C가 있다고 해보자. 이때 만일 릴레이션 R이 자신의 프로젝션(Projection) A, B, ..., C를 모두 조인한 결과가 자신과 동일한 경우 릴레이션 R은 조인 종속(A, B, ..., C)을 만족한다고 한다.
정규화 과정 정리
💡 정규화 단계 암기 요령 : 두부를 좋아하는 정규화가 두부가게에 가서 가게에 있는 두부를 다 달라고 말하니 주인이 깜짝 놀라며 말했다. 두부이걸다줘 ? -도부이결다조 도메인이 원자값 부분적 함수 종속 제거 이행적 함수 종속 제거 결정자이면서 후보키가 아닌 것 제거 다치 종속 제거 조인 종속성 이용
반정규화의 개념
📌 반정규화란 시스템의 성능 향상, 개말 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로, 의도적으로 정규화 원칙을 위배하는 행위이다.
반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만 데이터의 일관성 및 정합성이 저하될 수 있다.
과도한 반정규화는 오히려 성능을 저하시킬 수 있다.
반정규화를 위해서는 사전에 데이터의 일관성과 무결성을 우선으로 할지, 데이터베이스의 성능과 단순화를 우선으로 할지를 결정해야 한다.
반정규화 방법에는 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 속성 추가 등이 있다.
💡 정규화의 원칙 ? 정보의 무손실 표현, 즉 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있어서는 안 된다. 분리의 원칙, 즉 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜 표현해야 한다. 데이터의 중복성은 감소되어야 한다.
테이블 통합
📌 테이블 통합은 두 개의 테이블이 조인(Join)되는 경우가 많아 하나의 테이블로 합쳐 사용하는 것이 성능 향상에 도움이 될 경우 수행한다.
두 개의 테이블에서 발생하는 프로세스가 동일하게 자주 처리되는 경우, 두 개의 테이블을 이용하여 항상 조회를 수행하는 경우 테이블 통합을 고려한다.
테이블 통합의 종류에는 1:1 관계 테이블 통합, 1:N 관계 테이블 통합, 슈퍼타입/서브타입 테이블 통합이 있다.
데이터 검색은 간편하지만 레코드 증가로 인해 처리량이 증가한다.
테이블 통합으로 인해 입력, 수정, 삭제 규칙이 복잡해질 수 있다.
Not Null, Default, Check 등의 제약조건(Constraint)을 설계하기 어렵다.
💡 슈퍼타입/서브타입 : 슈퍼타입은 상위 개체를 서브타입은 하위 개체를 의미한다. 💡 Not Null : 속성 값이 Null이 될 수 없다. 💡 Default : 속성 값이 생략되면 기본값 설정 💡 Check : 속성 값의 범위나 조건을 설정하여 설정한 값만 허용
테이블 분할
테이블 분할은 테이블을 수식 또는 수평으로 분할하는 것이다.
수평 분할(Horizontal Partitioning)
수평 분할은 레코드(Record)를 기준으로 테이블을 분할하는 것이다.
레코드 별로 사용 빈도의 차이가 큰 경우 사용 빈도에 따라 테이블을 분할한다.
수식 분할(Vertical Partitioning)
수직 분할은 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할하는 것이다.
갱신 위주의 속성 분할 : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행할 수 없으므로 갱신이 자주 일어나는 속성들을 수직 분할하여 사용한다.
자주 조회되는 속성 분할 : 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직 분할하여 사용한다.
크기가 큰 속성 분할 : 이미니자 2GB 이상 저장될 수 있는 텍스트 형식 등으로 된 속성들을 수식 분할하여 사용한다.
보안을 적용해야 하는 속성 분할 : 테이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직 분할하여 사용한다.
💡 레코드 잠금 : 데이터의 무결성을 유지하기 위해 어떤 프로세스가 데이터 값을 변경하려고 하면 변경 작업이 완료될 때까지 다른 프로세스가 해당 데이터 값을 변경하지 못하도록 하는 것을 의미한다.
테이블 분할 시 고려 사항
기본키의 유일성 관리가 어려워진다.
데이터 양이 적거나 사용 빈도가 낮은 경우 테이블 분할이 필요한지를 고려해야 한다.
분할된 테이블로 인해 수행 속도가 느려질 수 있다.
데이터 검색에 중점을 두어 테이블 분할 여부를 결정해야 한다.
중복 테이블 추가
📌 여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블을 추가하여 작업의 효율성을 향상시킬 수 있다.
중복 테이블을 추가하는 경우
정규화로 인해 수행 속도가 느려지는 경우
많은 범위의 데이터를 자주 처리해야 하는 경우
특정 범위의 데이터만 자주 처리해야 하는 경우
처리 범위를 줄이지 않고는 수행 속도를 개선할 수 없는 경우
중복 테이블을 추가하는 방법은 다음과 같다.
집계 테이블의 추가 : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거(Trigger)를 설정하여 사용하는 것으로, 트리거의 오버헤드(Overhead)에 유의해야 한다.
진행 테이블의 추가 : 이력 관리 등의 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정한다.
특정 부분만을 포함하는 테이블의 추가 : 데이터가 많은 테이블의 특정 부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다.
💡 위의 이미지를 보면 <회원정보>, <상품정보>, <주문정보> 테이블의 데이터를 집계하는 집계 테이블을 추가하여 시스템 사용이 적은 시간에 배치 작업에 의해 원하는 데이터를 생성하여 사용하는 것이다.
중복 속성 추가
📌 중복 속성 추가는 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것이다.
중복 속성을 추가하면 데이터의 무결성 확보가 어렵고, 디스크 공간이 추가로 필요하다.
중복 속성을 추가하는 경우
조인이 자주 발생하는 속성인 경우
접근 경로가 복잡한 속성인 경우
액세스의 조건으로 자주 사용되는 속성인 경우
기본키의 형태가 적절하지 않거나 여러 개의 속성으로 구성된 경우
중복 속성 추가 시 고려 사항
테이블 중복과 속성의 중복을 고려한다.
데이터 일관성 및 무결성에 유의해야 한다.
SQL 그룹 함수를 이용하여 처리할 수 있어야 한다.
저장 공간의 지나친 낭비를 고려한다.
시스템 카탈로그(System Catalog)의 의미
📌 시스템 카탈로그는 시스템 그 자체에 관련이 있는 다양한 객체에 관한 정보를 포함하는 시스템 데이터베이스이다.
시스템 카탈로그 내의 각 테이블은 사용자를 포함하여 DBMS에서 지원하는 모든 데이터 객체에 대한 정의나 명세에 관한 정보를 유지 관리하는 시스템 테이블이다.
카탈로그들이 생성되면 데이터 사전(Data Dictionary)에 저장되기 때문에 좁은 의미로는 카탈로그를 데이터 사전이라고도 한다.
시스템 카탈로그 저장 정보
📌 시스템 카탈로그에 저장된 정보를 메타 데이터(Meta-Data)라고 한다.
메타 데이터의 유형
데이터베이스 객체 정보 : 테이블(Table), 인덱스(Index), 뷰(View) 등의 구조 및 통계 정보
사용자 정보 : 아이디, 패스워드, 접근 권한 등
테이블의 무결성 제약 조건 정보 : 기본키, 외래키, NULL 값 허용 여부 등
함수, 프로시저, 트리거 등에 대한 정보
💡 Catalog(카탈로그)의 사전적 의미는 상품 목록, 상품 안내서를 말한다. 즉, 어떤 상품을 소개하기 위해 기업에서 발행하는 책자다. 💡 메타 데이터 : '속성정보'라고도 불리는 메타 데이터는 '데이터에 관한 구조화된 데이터', '다른 데이터를 설명해 주는 데이터' 이다.
카탈로그의 특징
카탈로그 자체도 시스템 테이블로 구성되어 있어 일반 이용자도 SQL을 이용하여 내용을 검색해 볼 수 있다.
INSERT, DELETE, UPDATE 문으로 카탈로그 갱신하는 것은 허용되지 않는다.
데이터베이스 시스템에 따라 상이한 구조를 갖는다.
카탈로그는 DBMS가 스스로 생성하고 유지한다.
카탈로그의 갱신 : 사용자가 SQL 문을 실행시켜 기본 테이블, 뷰, 인덱스 등에 변화를 주면 시스템이 자동으로 갱신한다.
분산 시스템에서의 카탈로그 : 보통의 릴레이션, 인덱스, 사용자 등의 정보를 포함할 뿐 아니라 위치 투명성 및 중복 투명성을 제공하기 위해 필요한 모든 제어 정보를 가져야 한다.
💡 인덱스(Index) ? 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조이다. 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 💡 뷰(View) ? 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다.
카탈로그/데이터 사전을 참조하기 위한 DBMS 내의 모듈 시스템
데이터 정의어 번역기(DDL Compiler) : DDL을 메타 데이터를 갖는 테이브(카탈로그)로 변환하여 데이터 사전에 저장시킨다.
데이터 조작어 번역기(DML Compiler) : 응용 프로그램에 삽입된 DML문을 주 언어로 표현한 프로시저 호출로 변환하여 질의 처리기와 상호 통신한다.
Data Directory
데이터 사전에 수록된 데이터를 실제로 접근하는 데 필요한 정보를 관리 유지하는 시스템이다.
시스템 카탈로그는 사용자와 시스템 모두 접근할 수 있지만 데이터 디렉터리는 시스템만 접근할 수 있다.
질의 최적화기 : 사용자의 요구를 효율적인 형태로 변환하고 질의를 처리하는 좋은 전략을 모색한다.
트랜잭션 처리기 : 복수 사용자 환경에서 평행으로 동시에 일어나는 트랜잭션 문제를 해결하여, 각각의 사용자가 데이터베이스 자원을 배타적으로 이용할 수 있도록 한다.