DB 정규화
1. 데이터 베이스 이상현상
1. 이상 종류
# D.비이상 삽살개 🤣
① 삽입 이상 데이터 삽입, 의도, 다른 값 삽입
② 삭제 이상 데이터 삭제, 의도, 연쇄 삭제
③ 갱신 이상 CoFiAtt값 갱신시 일부 행튜레만 갱신되 모순 발생
2. 테이블(테이블(릴레이션))의 스키마 설계가 잘못되면 생기는 일..
① 중복된 데이터의 문제
- 저장 공간 낭비
- 실수로 인한 데이터 불일치 가능성 존재
따라서 가능하면 데이터 중복을 없도록 하는게 좋다.
② 빈번한 NULL값 사용
- 가능하면 NULL을 최대한 적게 사용하도록 하자.
③ 가짜 튜플 (Spurious Tuple)
- 조인 수행시 다른결과가 나오는 현상이 나면.. 올바르게 나오토록 설계한다.
2. 해결
데이터 베이스 정규화를 통해 해결한다.
2. Functional Dependency
① Functional Dependency : 함수 종속
-
DB에서는 CoFiAtt을 집합으로 나타낼 수 있다는걸 알고 있겠지?
empl_id empl_name birth_data position salary dept_id dept_name
-
Functional Dependency의 어원을 살펴보면
-
수학에서 함수(function)가 Input이 같으면 Output이 같다. 따라서 Key에 따라 집합이 같다 이므로..
-쉬운코드-
-
-
그렇다면 DB테이블(테이블(릴레이션))에서 FD에 대입해보자면
-
1. :Key집합 (Input) 가 같다면, :CoFiAtt 집합 (Output) 값도 같다.
2. 가 함수적으로 를 결정한다
3. 는 함수적으로 에 의존한다.
-쉬운 코드-
-
-
FD는 하나의 테이블(테이블(릴레이션))에서도 여러가지가 있다.
② Partial Functional Dependency : 부분 함수 종속
-
when holds(존재한다면),
if any Proper Subset(진 부분집합) of can determine ,
then is partial FD-
Proper Subset : 진 부분집합 > X = {a, b, c} 의 진 부분 집합은 > {}, {a},{b},{c}, {a,b}, {a,c}, {b,c}
-
-
예시로 을 Key로 사용하면 를 결정할 수 있다.
근데 잘 생각해보면 으로도 를 정의할 수 있다.
그런 점에서 이 테이블(테이블(릴레이션))은 부분 함수 종속이 존재한다고 할 수 있다. -
만약, 이 진부분 집합들 각각들이 전부 하나의 집합을 결정하지 못하는 경우가 있다,
즉, 수퍼셋을 Key로 사용해야지만. 결정이 가능할때, Fully Partial FD 라고 한다.
③ Transitive Functional Dependency : 이행 함수 종속
-
when Holds, then is Transitive FD
unless either or is NOT subset of any key
(모든 Non-Prime Attribute 는 어떤 key에 Transitive dependent하면 안된다.)
3. DB 정규화
# 도부 이결 다조?!! 🤣
1. 정의
- 데이터 베이스의 구조를 정의하는데 사용된다.
- D.비이상 삽살개를 해결해준다.
- 아무튼 이걸 해서 테이블(테이블(릴레이션))을 쪼개고 쪼개고 한다.
2. 용어
bank_name | account_num | account_id | class | ratio | empl_id | empl_name | card_id |
---|
Key
- 특징
-
- 유일성 유일한 값을 가져야 한다
- 최소한의 값으로 식별되어야 한다.
- 변하는 값이어선 안된다
- Super Key : 행튜레에서 행튜레한줄을 Unique 하게 식별 할 수 있는 CoFiAtt 집합
- 존내 많다..
- 최소성을 만족시키지 못한다.
- (Candidate) Key (후보키) : 슈퍼키이긴 한데 유일성과 최소성을 만족하는 키
- minimal super key와 동일함.
- {account_id}, {bank_name, account_num}
- Primary Key (기본키) : (Candidate) Key 중에서 table에서 특정 행튜레 한줄을 식별하는데 가장 알맞는 키
- NOTNNULL
- 중복값 X
- 테이블(테이블(릴레이션))에서 언더바 밑줄로 표기된다
- {account_id}
- Foreign Key (왜래키) : 두 테이블(테이블(릴레이션))을 연결하는데 사용되는 키
- 참조 무결성 제약 조건
- 외래키는 참조할 수 없는 키를 가질 수 없다.
- 값이 없다면 NULL이 될 수도 있다.
- 각 테이블(릴레이션)상에서 "A테이블(릴레이션)의 기본키"와 "B테이블(릴레이션)의 외래키"와 이름이 다를 수 있다.
Attribute
- prime attribute : 임의의 Key를 이루는데 사용되는 CoFiAtt
- account_id, bank_name, account_num
- non-prime attribute : 어떠한 Key에 속하지 않는 CoFiAtt
- class, ratio, empl_id, empl_name, card_id
3. 정규화 단계
FD 찾기
- ① 1NF(도메인 원자값으로)
- CoFiAtt값은 다중값을 가져선 안되고, 반복 그룹을 가져서도 안된다.
모든 CoFiAtt값은 반드시 하나의 값만 가져야 한다.
반복 되는 정보에 대한 키가 되는것을 ForeignKey로 테이블(테이블(릴레이션)) 분리 - ② 2NF(부분 함수 종속 제거)
- 모든 CoFiatt은 반드시 모든 PrimaryKey(기본키)에 종속이 되어야 한다.
2개의 CoFiAtt을 PrimaryKey로 사용할시 NonPrimaryAttribute 인 녀석이
이 PrimaryKey에 어떤놈은 종속하고 어떤놈은 종속 안할때 부분 함수 종속 이 DB라고 할 수 있다. - ③ 3NF(이행 함수 종속 제거)
- 키본키가 아닌 어떤 CoFiAtt(non-prime attribute)에 종속이 되는 CoFiAtts가 있다면 그걸 제거 해야 한다.
기본키가 아닌 모든 CoFiAtt간에는 서로 종속될 수 없다. 키에 해당하는 테이블(테이블(릴레이션))을 분리 시킨다.
x->y->z 를 x->z로 된다면
x -> y 테이블(테이블(릴레이션)) 따로, y -> z 테이블(테이블(릴레이션)) 따로 나눌 수 있는 상태 - ④ BCNF
- 모든 유효한 non-trivial FD 는 가 super key여야 한다.
즉, X가 슈퍼키가 되게끔 만들던지,
그렇게 못한다면 테이블(테이블(릴레이션))을 분리하면 된다.
참조
'CS > DB' 카테고리의 다른 글
| 니앙팽이 - DB | 8 | SQL - DML(데이터 조작어) (0) | 2023.09.14 |
---|---|
| 니앙팽이 - DB | 7 | SQL - DDL(데이터 정의어) (0) | 2023.09.14 |
| 니앙팽이 - DB | 6 | 조인 (내부, 외부) (0) | 2023.09.14 |
| 니앙팽이 - DB | 5 | 관계형 DBMS & 데이터 무결성 (0) | 2023.09.08 |
| 니앙팽이 - DB | 4 | DB 시스템 개요 (0) | 2023.09.07 |