
Database anomaly(=데이터베이스 이상현상)
1. update anomaly(=갱신 이상)
- 하나 바꾸려면 다 바꿔야함
- 데이터 갱신시 일관성 유지가 안되는 현상, 데이터 불일치(=inconsistency)발생
- 최유정 학생이 연락처를 변경하는 경우 B01, C01 튜플의 정보를 수정해야 하는데 1개의 튜플만 수정할 경우 발생
2. insert anomaly(=삽입 이상)
- 어떤 속성 값을 넣지 않는 이상 삽입이 불가능
- 튜플 삽입시 지정하지 않은 속성값이 NULL을 갖는 현상
- 1604 홍길동 010-7777-3333 학생이 있으나 아직 수강하는 과목이 존재하지 않는 경우에는 과목코드에 NULL값이 저장되는 현상
3. delete anomaly(=삭제 이상)
- 연쇄 삭제에 의한 정보 손실
- 1602 서현진 학생이 A01 과목을 수강취소 하는 경우 해당 튜플이 삭제되어 의도치 않게 서현진 학생의 연락처 정보가 삭제되는 현상
이상의 원인 : Attribute 간에 존재하는 여러 종속 관계를 하나의 릴레이션에 표현, 하나의 테이블에 표현하기 때문이다.
해결책 : Attribute 간의 종속관계를 분석하여 여러개의 릴레이션으로 분해한다. -> Normalization(정규화)
Functionally dependency (FD, 함수 종속)
어떤 릴레이션(R)에서, Attribute X의 값 각각에 대해 Attribute Y의 값이 하나만 연관
X → Y : Y는 X에 종속
X는 Y를 결정한다. 즉 X는 Y의 결정자(determinant)
학번이 학년을 결정한다. 과목번호나 성적을 결정하진 못한다.
만약 학번이 성적을 결정하려면 성적이 다 과목마다 똑같아야 한다. 물론 실제로는 그렇지 않다.
- 하나의 테이블에서 X가 key 이면, R의 모든 attribute Y에 대해 X→Y가 성립한다.
= X가 key라는 것은 값이 중복되지 않는다는 얘기이므로 당연히 결정자가 된다. - X→Y일 경우 X가 반드시 key는 아니다.
= 학번이 성적을 결정하지 않을 수 있다.
부분함수 종속 : 하나만 가지고 테이블 분해 (학번만)
완전함수 종속 : 두개 이상으로 테이블 분해 (학번, 과목번호 모두)
1NF → (부분함수 종속) → 2NF → (이행적함수 종속) → 3NF → (후보키가 아닌 결정자를 제거) → BCNF
Normal Form(정규형)
어떤 일련의 제약 조건을 만족하는 릴레이션
Normalization(정규화)의 원칙
- 정보가 유지돼야 한다.
- 중복성을 감소해야한다.
- 독릭접인 관계는 별개의 릴레이션으로 표현한다.
Functionally dependency 기준으로 Boyce-Codd Normal Form : 모든 결정자는 후보키
Multivalued dependency 기준으로 Fourth Normal Form
1NF : 모든 속성은 반드시 하나의 값만 가져야 한다.
모든 도메인이 원자값(atomatic value)만으로 된 릴레이션
학번→지도교수
지도교수→학과
학번 → 학과
학번 + 과목번호 → 성적
2NF : 모든 필드의 값은 반드시 기본 키에 종속되어야 한다.
기본키 일부에만 종속되어서는 안된다.
A B
B C 이렇게 찢는 것이 이행적 함수 종속
제 3 정규화 과정
3NF : 기본키가 아닌 모든 속성간에는 서로 종속될 수 없다.
Boyce-Codd Normal Form(BCNF)
보이스코드 정규화 과정
학번 | 과목코드 | 이름 | 연락처 |
1601 | C01 | 강하늘 | 010-1234-0000 |
1601 | C02 | 강하늘 | 010-1234-0000 |
1602 | A01 | 서현진 | 010-3333-0000 |
1603 | B01 | 최유정 | 010-5555-0000 |
1603 | C01 | 최유정 | 010-5555-0000 |
Reference :
www.youtube.com/watch?v=pMcv0Zhh3J0
www.youtube.com/watch?v=kxeOZq24xX4&list=PLwaVnP-dAv340OykuIQcfCkirxYQs2Dr7&index=6
'🚛 Database > Database' 카테고리의 다른 글
데이터베이스 - View, Trigger (0) | 2021.05.24 |
---|---|
데이터베이스 - Transaction (0) | 2021.05.12 |
데이터베이스 - Primary key, Alternate key (0) | 2021.04.30 |
데이터베이스 - API (0) | 2021.04.14 |
데이터베이스 - 내장 SQL (Embedded SQL), 커서 (Cursor) (0) | 2021.04.14 |