정규화의 목적(최적화) → 변화에 유연한 대처를 위해
- 불필요한 데이터를 제거, 데이터의 중복을 최소화 하기 위해
- 데이터베이스 구조 확장 시 재디자인을 최소화
- 다양한 관점에서의 query를 지원하기 위해서
- 무결성 제약조건의 시행을 간단하게 하기 위해서
- 각종 이상 현상(Anomaly) 을 방지하기 위해서, 테이블의 구성을 논리적이고 직관적으로 한다.
- 데이터의 중복을 줄이고, 무결성을 향상 → 관계형 데이터베이스를 정규화된 형태로 재디자인하는 것
제 1정규화(First Normal Form, 1NF)
테이블(Relation)이 제 1정규형을 만족했다는 것은 아래 세 가지 조건를 만족했다는 것을 의미한다.
- 어떤 Relation에 속한 모든 Domain이 원자값(atomic value)만으로 되어 있다.
- 모든 attribute에 반복되는 그룹(repeating group)이 나타나지 않는다.
- 기본 키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.
1 정규형 위반 → 바꾼 형태
제 2정규화(Second Normal Form, 2NF)
제 2정규화를 수행 했을 경우 테이블의 모든 컬럼이 완전 함수적 종속을 만족한다.(부분 함수적 종속을 모두 제거되었다.) 이를 이해하기 위해서는 부분 함수적 종속과 완전 함수적 종속이라는 용어를 알아야 한다.
조금 쉽게 말하면, 테이블에서 기본키가 복합키(키1, 키2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안된다.
- 함수적 종속: X의 값에 따라 Y값이 결정될 때 X -> Y로 표현하는데, 이를 Y는 X에 대해 함수적 종속 이라고 한다. 예를 들어 학번을 알면 이름을 알 수 있는데, 이 경우엔 학번이 X가 되고 이름이 Y가 된다. X를 결정자이라고 하고, Y는 종속자라고 한다. 다른 말로 X가 바뀌었을 경우 Y가 바뀌어야만 한다는 것을 의미한다.
- 함수적 종속에서 X의 값이 여러 요소일 경우, 즉, {X1, X2} -> Y일 경우, X1와 X2가 Y의 값을 결정할 때 이를 완전 함수적 종속 이라고 하고, X1, X2 중 하나만 Y의 값을 결정할 때 이를 부분 함수적 종속 이라고 한다.
Manufacture과 Model이 키가 되어 Model Full Name을 알 수 있다.
Manufacturer Country는 Manufacturer로 인해 결정된다. (부분 함수 종속)
따라서, Model과 Manufacturer Country는 아무런 연관관계가 없는 상황이다.
결국 완전 함수적 종속을 충족시키지 못하고 있는 테이블이다. 부분 함수 종속을 해결하기 위해 테이블을 아래와 같이 나눠서 2NF를 만족할 수 있다.
제 3정규화(3NF)
2NF가 진행된 테이블에서 이행적 종속을 없애기 위해 테이블을 분리하는 것이다.
이행적 종속 : A → B, B → C면 A → C가 성립된다
아래 두가지 조건을 만족시켜야 한다.
- 릴레이션이 2NF에 만족한다.
- 기본키가 아닌 속성들은 기본키에 의존한다.
현재 테이블에서는 Tournament와 Year이 기본키다.
Winner는 이 두 복합키를 통해 결정된다.
하지만 Winner Date of Birth는 기본키가 아닌 Winner에 의해 결정되고 있다.
따라서 이는 3NF를 위반하고 있으므로 아래와 같이 분리해야 한다.
BCNF - 제 3정규화(3NF) upgrade
BCNF, 즉 보이스-코드 정규 형(Boyce-Codd Normal Form)은 데이터베이스의 정규화 과정 중 하나입니다. 이 과정은 데이터베이스 설계를 개선하여 불필요한 데이터 중복을 제거하고, 데이터 무결성을 유지하기 위해 사용됩니다. BCNF는 제3정규형(3NF)의 한계를 극복하기 위해 도입되었으며, 함수적 종속성을 사용하여 더 엄격한 조건을 적용합니다.
함수적 종속성이란, 어떤 속성의 값이 다른 속성의 값에 의해 결정될 때, 두 속성 간에 존재하는 관계를 말합니다. 예를 들어, "학번"이라는 속성이 "학생 이름"이라는 속성을 결정한다면, 학번에 대해 학생 이름은 함수적으로 종속되었다고 말할 수 있습니다.
BCNF의 정의는 다음과 같습니다: 데이터베이스 스키마 이 BCNF에 있으려면, 의 모든 결정자가 후보 키의 부분집합이어야 합니다. 즉, 모든 비자가 함수적 종속은 후보키에 대해서만 있어야 합니다.
BCNF를 이해하기 위한 예시를 들어보겠습니다.
예시: 강의 스케줄 데이터베이스
고려해 볼 테이블은 다음과 같은 속성을 가지고 있습니다:
- 강의 ID (LectureID)
- 강사 이름 (InstructorName)
- 강의실 (Room)
여기서, 각 강의 ID는 고유한 강사와 강의실에 매핑됩니다. 또한, 각 강사는 하나의 강의실에서만 강의를 진행한다고 가정해봅시다. 이러한 경우, 다음과 같은 함수적 종속성이 존재합니다:
- LectureID → InstructorName, Room (강의 ID로 강사 이름과 강의실을 알 수 있음)
- InstructorName → Room (강사 이름으로 강의실을 알 수 있음)
위의 스키마는 제3정규형을 만족하지만 BCNF를 만족하지 않습니다.
왜냐하면 "InstructorName → Room" 함수적 종속성에서 발생합니다.
여기서 강사 이름(InstructorName)은 강의실(Room)을 결정합니다. 이 경우 강사 이름이 결정자 역할을 하지만, 후보 키는 아닙니다. 왜냐하면 주키(LectureID)만이 모든 정보를 결정하는 유일한 키이며, InstructorName은 LectureID에 의해 결정되는 속성 중 하나일 뿐이기 때문입니다.
즉, "InstructorName → Room" 종속성이 있는 상황에서는 InstructorName이 강의실을 결정할 수 있지만, InstructorName이 후보 키가 아닌 상태에서는 BCNF를 위반하게 됩니다. BCNF에서는 모든 결정자가 후보 키여야 하므로, 이 구조는 BCNF를 만족하지 않습니다.
BCNF를 만족시키기 위해 데이터베이스를 다음과 같이 분해할 수 있습니다:
- Lecture 테이블: (LectureID, InstructorName) - 각 강의 ID와 강사 이름을 매핑
- Instructor 테이블: (InstructorName, Room) - 각 강사와 강의실을 매핑
이제, 각 테이블은 BCNF를 만족합니다. 강의 테이블에서는 LectureID가 후보 키이며, Instructor 테이블에서는 InstructorName이 후보 키입니다. 따라서, 모든 함수적 종속성이 후보 키에 의해서만 결정되므로, 데이터 중복 및 갱신 이상 현상을 방지할 수 있습니다.
요약.
제 1정규화 : 테이블 컬럼이 원자값 (하나의 값)을 갖도록 테이블을 분리
제 2정규화 : 기본키가 복합키(키1, 키2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안됌
제 3 정규화: 2NF가 진행된 테이블에서 이행적 종속을 없애기 위해 테이블을 분리(이행적 종속 : A → B, B → C면 A → C가 성립)
보이스-코드 정규형(BCNF) : BCNF는 3NF보다 더 엄격한 정규형으로, 모든 종속성이 후보 키에 대해서만 존재해야 합니다. 즉, 모든 결정자는 후보 키여야 합니다. 결정자란 다른 속성을 함수적으로 결정하는 속성을 의미합니다.
'1분 테크' 카테고리의 다른 글
Enum (0) | 2024.06.25 |
---|---|
전략패턴(Strategy) 패턴 (0) | 2024.06.10 |
싱글톤(Singleton) 패턴 (0) | 2024.05.31 |
댓글