2023. 4. 10. 23:59ㆍDataBase
Chatper 1 Normal forms
데이터베이스의 정규화는 데이터베이스의 구조를 최적화하여 데이터 중복과 종속성을 줄이는 프로세스이다.
이를 통해 데이터베이스의 유지 보수성과 효율성을 높일 수 있다.
Design Theory (디자인 이론)
- 데이터의 중복은 있으면 안된다(anormalies)
- 데이터셋에서 예기치 않게 발생하는 이상 현상
- 이는 데이터가 정확하게 수집, 저장, 처리 되지 않으면서 발생하는 문제
- 정규화 형태
- 1st Normal Form(1NF) : 모든 테이블은 Flat하다. 한테이블의 모든 정보가 있다. (Normal Form)
- 데이터는 원자성을 가진다. (하나의 셀 안에 들어가는 정보는 유일해야한다)
- 테이블에 제한 조건 적용을 통해서 Anormalies를 없앤다
- 한번에 같은 정보를 변경하려하면 일부는 누락될 수 있으므로 한번에 하나만 갱신한다면 이러한 문제점을 해결할 수 있다.
- 예시
- 1st Normal Form(1NF) : 모든 테이블은 Flat하다. 한테이블의 모든 정보가 있다. (Normal Form)
- redudancy anormalies : 중복 데이터가 존재 예를 들어 정정기간에 방의 번호를 바꾸려면 바꿔야하는 테이블의 로우수가 많이 존재하게 되는데 특정한 경우 일부 테이블의 정보가 갱신이 안되는 경우가 생길 수 있다. 이를 해결하기 위해 갱신할 로우수를 줄이면 된다. 혹은 하나씩 갱신하는 것이다.
- update anormalies : 갱신시 특정한 값 하나만 바꾸면 어떤게 맞는지 혼란이 생길 수 있다.
- delete anormalies : 학생들이 특정 강의실에 듣고 있는데 학생들이 전부 수강신청을 하지 않았다면 방에 대한 정보를 표현할 방법이 없다. 또한 폐강 되었을 경우 Room에 대한 정보가 사라지는데 원래 가지고 있어야할 정보를 기록하지 못하고 잃어버리는 상황
- insert anormalies : 강의는 개설이 됐고 방도 있지만 학생들이 없어서 일부 데이터만 삽입하려하면 문제가 생길 수 있다.
- 제 1 정규화의 문제점은 테이블이 평면적이기 때문에 RUDI가 발생해도 대처할 수 없다
- 테이블을 분해해서 정보가 중복되지 않도록 관리하는 방법
- 위의 테이블에서는 어디에도 중복이 존재하지 않는다 위의 테이블에 R은 해당 X
- Joe가 CS 229로 변경된다면 수강 과목이 바뀌었으므로 괜찮다
- 혹은 CS229가 CS334로 바뀔 경우 문제가 있을 수 있지만 해당 테이블에서만 보면 문제는 없다 하지만 외래키 참조에 의한 다른 테이블에도 정보 갱신을 해야한다는 문제가 남아있다.
- 또한 삭제할경우 과목정보나 방정보가 사라지는게 아니기 때문에 괜찮다
- 그리고 CS334가 추가된다고 해서 기존 테이블 정보에 영향을 미치지 않기에 가능하다
- 제1정규화(1NF): 모든 속성이 원자값(Atomic Value)을 갖도록 테이블을 분해합니다. 즉, 각 컬럼에는 하나의 값만 저장되도록 합니다.
- 제2정규화(2NF): 테이블 내에서 기본키가 아닌 다른 속성이 기본키에 대해 완전 함수적 종속(Fully Functional Dependency)을 갖도록 테이블을 분해합니다. 즉, 기본키에 대해 유일한 값을 가지며, 다른 속성에 대해서도 유일한 값을 갖는 경우 분해합니다.
- 제3정규화(3NF): 테이블 내에서 비기본키 속성 간의 이행적 함수적 종속(Transitive Dependency)을 제거하여 테이블을 분해합니다. 즉, 다른 비기본키 속성에 종속적인 속성을 새로운 테이블로 분해합니다.
- Boyce- Codd Normal From (BCNF)
단계정리
1. 제 1정규화 (1NF)
제 1정규화는 테이블의 각 열에 하나의 값만 포함되도록 데이터를 구성하는 프로세스입니다. 이를 위해 테이블의 열을 중첩 테이블로 분리합니다. 예를 들어, 주문 테이블에서 각 주문의 다중 품목을 나타내는 열을 새로운 테이블로 분리하는 것입니다.
2. 제 2정규화 (2NF)
제 2정규화는 테이블 내의 각 열이 기본 키와 관련된 데이터만을 포함하도록 데이터를 구성하는 프로세스입니다. 이를 위해 테이블을 다중 테이블로 분해합니다. 예를 들어, 제품 주문 테이블에서 제품 정보를 포함하는 열을 제품 테이블로 분리하는 것입니다.
3. 제 3정규화 (3NF)
제 3정규화는 테이블 내의 각 열이 기본 키와 직접적으로 관련된 데이터만을 포함하도록 데이터를 구성하는 프로세스입니다. 이를 위해 테이블을 다시 분해합니다. 예를 들어, 주문 테이블에서 고객 정보를 포함하는 열을 고객 테이블로 분리하는 것입니다.
이외에도 보이스-코드 정규화, 네덜란드 정규화, BCNF(Boyce-Codd 정규형) 등 다양한 정규화 방법이 존재합니다. 이러한 정규화 방법들은 데이터의 특성과 상황에 따라 적용되며, 데이터베이스의 구조 최적화를 위해 선택적으로 적용됩니다.
BCNF
BCNF는 Boyce-Codd 정규화라고도하며, 데이터베이스에서 중복을 제거하고 일관된 관계를 유지하기 위한 데이터베이스 정규화의 한 형태입니다. BCNF는 제2 정규형(2NF)보다 더 엄격한 요구 사항을 가지며, 특히 다중 속성 종속(multivalued dependency)을 처리할 수 있습니다.
BCNF는 다음과 같은 조건을 만족해야 합니다:
- 모든 결정자는 후보키(candidate key)의 일부여야 합니다.
- 모든 비-키 속성은 후보키에 대해 완전 함수 종속(normal form functional dependency)되어야 합니다.
첫 번째 조건은 하나의 테이블에서 여러 후보키가 있을 때, 그 후보키들 모두를 이용하여 함수 종속을 만족하는 경우에 해당합니다. 이러한 경우에는 테이블을 분해하여 BCNF를 만족시켜야 합니다.
두 번째 조건은 비-키 속성이 후보키의 일부가 아닌 경우, 해당 비-키 속성이 후보키의 일부가 아닌 다른 속성에 종속되지 않도록 보장하는 것을 의미합니다.
BCNF는 제2 정규형(2NF)보다 엄격한 요구 사항을 가지기 때문에, 모든 2NF 관계는 BCNF입니다. 하지만, BCNF가 모든 문제를 해결해주는 것은 아닙니다. 다중 속성 종속이 존재할 경우, 이를 해결하기 위해서는 더 높은 정규화 단계인 제3 정규형(3NF)이나 보이스-코드 정규형(4NF)을 적용해야 할 수도 있습니다.
Chapter 2 Functional Dependencies
- A functionally determines : A가 결정이 되면 B는 자동적으로 결정이 된다
함수 종속 관계의 핵심
A가 B를 결정하려면 ti tj로우 모두 동의해야함
모든 로우에 대해서 똑같은 현상이 일어나야지 함수 종속 관계 표현 가능
if ti[A1] = tj[A1] AND ti[A2]=tj[A2] ... ti[Am] = tj[Am]
이 정보가 같다면 B역시 같다
- FDs의 중요성
- 테이블의 의존성
- 테이블의 삽입, 삭제, 갱신 이상현상들을 FDs를 통해 손쉽게 해결할 수 있다.
- 과정
- 어떤 릴레이션 스키마부터 시작해서
- 그안에 있는 함수 종속 관계를 모두 찾음
- 이것을 분해하며 관계의 의존성을 삭제시켜 나가면 좀 더 좋은 디자인이 될 수 있다.
이 릴레이션을 보면 Course -> Room 처럼 CS145의 경우 B01호실에 배정되는 것과 같은 경우를 말한다
반대로 Room->Course가 될 수 있지만 중요도로 따졌을 때 방은 바뀔 수 있다. 그러므로 Course가 좀 더 중요한 attributes이다
FD
Position이 Phone를 결정하고 있다
{Position} -> {Phone}
단 {Phone} -> {Position}은 아님
Phone에 따라 포지션이 다르기 때문이다
FD를 만족하는 암스트롱의 규칙
- Split/Combine 규칙: 만약 릴레이션 R에서 A와 B의 조합이 C를 결정한다면, R을 두 개의 릴레이션 R1(A, B)와 R2(A, C-B)로 분해할 수 있습니다. 이를 Split 규칙이라고 합니다. 반대로, R1(A, B)와 R2(A, C-B)를 결합하면 R(A, B, C)를 얻을 수 있습니다. 이를 Combine 규칙이라고 합니다.
- Reduction/Trivial 규칙: 만약 A -> B이라면, A도 B의 상위 집합(subset)이 되므로, A -> A와 같은 Trivial한 함수 종속성은 삭제할 수 있습니다. 반대로, A -> BC와 같은 함수 종속성을 A -> B와 A -> C로 분해할 수 있습니다. 이를 Reduction 규칙이라고 합니다.
- Transitive Closure: 함수 종속성을 통해 유도되는 모든 함수 종속성을 찾는 것을 말합니다. 예를 들어, A -> B, B -> C라면, A -> C를 유도할 수 있습니다. 이러한 모든 함수 종속성을 찾는 것을 Transitive Closure라고 합니다. 이를 위해 Transitive Rule을 적용할 수 있습니다.
4. 왼쪽에 있는 것이 오른쪽에 나타났으므로 Trivial
5. Name->Color이고 Name,Category -> Color이므로 A->B B->C = A->C 이기에 Transitive Closure
6. Category를 통해 Category가 나왔으므로 Trivial
7. 5번 6번을 통해 결과들을 병합하고 있으므로 Combine
8. 7번을 보면 Name과 Category를 통해 Color와 Category를 알 수 있는데 이는 곧 Price를 의미한다
A->B B->C = A->C로 Transitive Closure
Chapter 3 Closure
A1,....,An 의 속성과 Fd들의 집합 F가 있다.
Fd들이 굉장히 많은데 하나하나 모두 나열하는건 의미가 없다.
Fd가 결정할 수 있는 오른쪽에 둘 수 있는 속성들의 집합을 표현할 수 있게 하는 것이 Closure
closure은 {A1, ... , An}+와 같이 표현한다.
Closure를 찾아야 하는 이유는 해당 테이블에서 키로 쓸 수 있는 속성을 알아내기 위해서이다.
예제를 보면 name은 trivial까지 포함시켜 color를 알 수 있고
category는 department
color와 category를 알면 price까지 가능하다
그래서 {name}+={name, color}
{name, category}+= {name, category, color, dep, price}
{color}+ = {color} 처럼 알 수 있다.