1~4. 이상 현상이 뭘까요?
*주로 관계형 데이터베이스에서 발생하는 문제로, 데이터의 무결성이 깨지는 상황을 의미
1) 삽입 이상(Insertion Anomaly)
- 데이터를 삽입하기 위해 필요한 정보가 부족한 상황
ex. 직원을 추가할 때 'IT' 부서가 없는데, 설정했을 때
2) 갱신 이상(Update Anomaly)
- 중복된 정보로 인해 동일한 내용을 여러 번 갱신해야 하는 상황
ex. 부서 이름이 변경되면, 해당 부서에 있는 모든 직원 레코드 수정
3) 삭제 이상(Deletion Anomaly)
- 특정 데이터를 삭제할 때, 그 정보와 관련된 다른 정보도 함께 삭제되는 상황
ex. 부서 정보를 삭제하면, 해당 부서에 있는 모든 직원 레코드 삭제
이러한 이상현상를 방지하기 위해 "데이터 정규화"를 한다.
5. 함수 종속성이 무엇인가요?
https://mangkyu.tistory.com/110
*한 관계에서 속성들 간의 의존 관계를 나타낸다.
특히 한 속성의 값이 다른 속성의 값을 결정하거나 식별하는 경우, 해당 속성은 다른 속성에 함수적으로 종속되어 있다고 말한다.
[개념]
- 속성 X의 값 각각에 대해, 항상 속성 Y의 값이 오직 하나만 연관되어 있을 때
Y는 X에 함수 종속이라 하고, "X → Y" 라 표기한다.
- 이 때 X는 결정자, Y는 종속자
예시)
- 학생 테이블에서, 학번이 주어지면 학생의 이름을 유일하게 식별할 수 있다.
이 때 "학번 → 이름" 함수 종속성이 성립한다. (이름이 학번에 함수 종속)
- 직원 테이블에서
이 때 "직급 → 급여" 함수 종속성이 성립한다. (급여가 직급에 함수 종속)
6. 완전 함수적 종속은 뭔가요?
*종속자가 기본키에만 종속되며, 기본키가 여러 속성으로 구성되어 있을 경우
기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우
그림 1. 에서는 '사원번호, 부서번호'가 기본키로 지정되어 있다.
기본키(사원번호, 부서번호)를 통해서 종속자(직책)을 종속하는 경우를 "완전 함수 종속"이라 한다.
7. 부분 함수적 종속은 뭔가요?
*릴레이션에서 종속자가 기본키가 아닌 다른 속성에 종속되거나, 기본키가 여러 속성으로 구성되어 있을경우
기본키를 구성하는 속성 중 일부만 종속된 경우
위의 설명에서 완전 함수 종속관계에는 "기본키(사원번호, 부서번호) - 종속자(직책) 가 있다는 것을 확인했다.
부분 함수 종속의 경우
기본키 중 '사원번호'를 통해서 종속자(사원이름, 주소, 전화번호)를 종속할 수 있으며,
기본키 중 '부서번호'를 통해서 종속자(부서이름)를 종속할 수 있다.
8. 이행적 함수적 종속은 뭔가요?
*릴레이션에서 X, Y, Z라는 3개의 속성이 있을 때, X → Y, Y → Z 의 종속 관계가 있을 경우
X → Y → Z 가 성립될 때 이행적 함수 종속이라고 한다.
X(사원번호)를 통해서 Y(사원이름)을 종속할 수 있다.
Y(사원이름)을 통해서 Z(주소, 전화번호, 직책)을 종속할 수 있다.
또한 X(사원번호)를 통해서 Z(주소, 전화번호, 직책)을 종속할 수 있으므로, 이는 "이행적 함수 종속"이 된다.
9. 정규화(Normalization)에 대해서 설명해주세요.
https://mangkyu.tistory.com/110
https://superohinsung.tistory.com/111
*데이터 중복을 줄이기 위해, DB를 구성하고 구조화하는 프로세스
[개념]
- 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스
[장점]
- DB 변경 시 이상 현상(삽입, 갱신, 삭제)을 제거할 수 있다.
- 중복된 데이터를 허용하지 않음으로써, 무결성을 유지할 수 있으며 DB의 저장 용량을 줄일 수 있다.
[단점]
- 릴레이션의 분해로 인해 릴레이션 간의 JOIN 연산이 많아진다.
- JOIN으로 인한 성능 저하가 나타나면, 반정규화를 적용할 수도 있다.
10. 제 1 정규형에 대해서 설명해주세요.
*테이블의 컬럼이 원자값(Atomic Value)을 갖도록 테이블을 분해하는 것
이름 | 학년 | 수강과목 |
A | 1 | C, C++ |
B | 2 | Java |
C | 3 | Database, OS |
위 테이블에서 학생 A, C는 여러 개의 수강 과목을 지니고 있다.
이름 | 학년 | 수강과목 |
A | 1 | C |
A | 1 | C++ |
B | 2 | Java |
C | 3 | Database |
C | 3 | OS |
이를 제 1 정규화를 진행하여, '수강과목' 컬럼이 원자값을 갖도록 한다.
11. 제 2 정규형에 대해서 설명해주세요.
*제 1 정규화를 진행한 테이블에 대해, 완전 함수 종속을 만족하도록 테이블을 분해하는 것
(완전 함수 종속 : 기본키의 부분집합이 결정자가 되어선 안된다는 의미)
- '부분 함수적 종속'이 있는 부분을 별도의 테이블로 분리하는 것
[수강강좌]
학생번호 | 강좌 이름 | 강의실 | 성적 |
1 | C | 공학관 101 | 3.5 |
2 | C | 공학관 101 | 3.0 |
1 | Java | 공학관 102 | 4.5 |
3 | Java | 공학관 102 | 4.0 |
3 | Database | 공학관 103 | 4.5 |
위 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다.
그리고 (학생번호, 강좌이름)인 기본키는 '성적'을 결정하고 있다. (학생번호, 강좌이름) → (성적)
그런데 여기에서 '강의실' 컬럼은 기본키의 부분집합인 '강좌이름'에 의해 결정될 수 있다. (강좌이름) → (강의실)
즉, 기본키의 부분키인 '강좌이름'이 결정자이기 때문에
아래와 같이 기존의 테이블에서 '강의실'을 컬럼을 분해하여 별도의 테이블로 관리하여 제 2 정규형을 만족시킬 수 있다.
[수강]
학생번호 | 강좌 이름 | 성적 |
1 | C | 3.5 |
2 | C | 3.0 |
1 | Java | 4.5 |
3 | Java | 4.0 |
3 | Database | 4.5 |
[강의실]
강좌 이름 | 강의실 |
C | 공학관 101 |
C | 공학관 101 |
Java | 공학관 102 |
Java | 공학관 102 |
Database | 공학관 103 |
12. 제 3 정규형에 대해서 설명해주세요.
*제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
[계절학기]
학생번호 | 강좌 이름 | 수강료 |
1 | Algorithm | 30000 |
1 | Computer Network | 50000 |
2 | OS | 70000 |
3 | Algorithm | 30000 |
'학생번호(A)'는 '강좌이름(B)'을 결정하고 있고, '강좌이름(B)'은 '수강료(C)를 결정하고 있다. ( A → B → C )
이러한 이행적 함수 종속을 제거하기 위해
(학생번호, 강좌이름), (강좌이름, 수강료) 테이블로 분해해야 한다.
이행적 함수 종속을 제거하는 이유는 간단하다.
예를 들어, 1번 학생의 수강 강좌를 OS로 변경한다고 하자.
이행적 함수 종속이 존재한다면 OS 수업을 30000원에 듣게 된다.
강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 번거로움을 해결하기 위해 제 3 정규화를 하는 것이다.
[계절수강]
학생번호 | 강좌 이름 |
1 | Algorithm |
1 | Computer Network |
2 | OS |
3 | Algorithm |
[수강료]
강좌 이름 | 수강료 |
Algorithm | 30000 |
Computer Network | 50000 |
OS | 70000 |
Algorithm | 30000 |
13. BCNF 정규형에 대해서 설명해주세요.
*제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
[교양수강]
학생번호 | 강좌 이름 | 교수 |
1 | 한국사 | 김-- 교수 |
2 | 한국사 | 김-- 교수 |
3 | 대중문화읽기 | 이-- 교수 |
4 | 일본어 | 박-- 교수 |
5 | 일본어 | 문-- 교수 |
교양수강 테이블에서 기본키는 (학생번호, 강좌이름)이다.
그리고 '학생번호, 강좌이름'은 '교수'를 결정하고 있다.
반대로 '교수' 또한 '강좌이름'을 결정하고 있다.
여기에서 문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니라는 점이다.
그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해하여,
다음과 같이 [교양신청], [교양교수] 테이블로 분해할 수 있다.
[교양신청]
학생번호 | 강좌 이름 |
1 | 한국사 |
2 | 한국사 |
3 | 대중문화읽기 |
4 | 일본어 |
5 | 일본어 |
[교양교수]
강좌 이름 | 교수 |
한국사 | 김 교수 |
한국사 | 김 교수 |
대중문화읽기 | 이 교수 |
일본어 | 박 교수 |
일본어 | 문 교수 |
14. 반정규화에 대해서 설명해주세요.
*DB의 성능 향상을 위하여, 데이터 중복을 허용하고 JOIN 연산을 줄이는 프로세스
[개념]
- 정규화된 엔티티∙속성∙관계에 대해
시스템의 성능향상과 개발, 운영의 단순화를 위해 중복∙통합∙분리 등을 수행하는 데이터 모델링 기법
[장점]
- 조회(select) 속도를 향상시킨다.
[단점]
- 데이터 모델의 유연성이 낮아진다.
- 데이터 무결성이 깨지는 것을 유의하여 적용해야 한다.
[수행하는 이유]
- 기본적으로 정규화는 입력 / 수정 / 삭제뿐만 아니라 조회에 대해서도 성능을 향상시키지만,
엔티티의 갯수가 증가하고 관계가 많아져 대규모 데이터를 처리할 때 성능이 저하된다.
- 정규화에 충실하여 종속성∙활용성은 향상 되었지만, 디스크 I/O량이 많아져 수행속도가 느려진 경우
- 다랑 or 특정 범위의 데이터만 자주 처리하는 경우
'CS > 데이터베이스' 카테고리의 다른 글
5주차. DB 트랜잭션, 회복 (0) | 2023.12.04 |
---|---|
3주차. Index (0) | 2023.11.22 |
2주차. SQL (0) | 2023.11.12 |
1주차. 데이터베이스 & 관계형 데이터베이스 기본 개념 (0) | 2023.11.08 |