본문 바로가기

IT/정보처리기사

[시나공 토막강의] 44-46강 정리

44강. 이상 / 함수적 종속

 

1. 이상(Anomaly)

- 테이블에서 일부 속성들의 종속으로 인해 데이터의 중복이 발생하고, 이 중복(Redundancy)으로 인해 테이블 조작 시 문제가 발생하는 현상

 ex) 삽입 이상(Insertion Anomaly), 삭제 이상(Deletion Anomaly), 갱신 이상(Update Anomaly)

 

 1) 삽입 이상(Insertion Anomaly) : 테이블에 데이터를 삽입할 때 의도와는 상관 없이 원하지 않는 값들로 인해 삽입할 수 없게 되는 현상

  ex) 학번과 과목번호를 합친게 기본키인 <수강> 테이블에서 학번이 "600"인 학생의 학년이 "2"라는 사실만을 삽입하고자 하는 경우, 삽입 이상이 발생함(과목번호를 모르기 때문)

 

 2) 삭제 이상(Deletion Anomaly) : 테이블에서 한 튜플을 삭제할 때 의도와는 상관없는 값들도 함께 삭제되는, 즉 연쇄 삭제가 발생하는 현상

  ex) <수강> 테이블에서 학번이 "200"인 학생이 과목번호 "C123"의 등록을 취소하고자 하는 경우 삭제 이상이 발생함(과목번호 뿐만 아니라 같은 튜플에 속한 성적, 학년에 대한 정보도 지워짐)

 

 3) 갱신 이상(Update Anomaly) : 테이블에서 튜플에 있는 속성 값을 갱신할 때 일부 튜플의 정보만 갱신되어 정보에 불일치성(Inconsistency)이 생기는 현상

  ex) <수강> 테이블에서 학번이 "400"인 학생의 학년을 "4"에서 "3"으로 변경하고자 하는 경우 갱신 이상이 발생할 수 있음(학번이 "400"인 학생 관련 튜플이 2개 이상일 경우 한 튜플만 갱신되고 나머지는 그대로 남으면 정보의 불일치성 발생)

 

2. 함수적 종속(Functional Dependency)

- 어떤 테이블 R에서 속성 X와 Y를 각각 R의 속성 집합의 부분 집합이라 하자.

- 속성 X의 값 각각에 대해 시간에 관계없이 항상 속성 Y의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수적 종속 또는 X가 Y를 함수적으로 결정한다고 하고, X(결정자 ex.학번) -> Y(종속자 ex.이름) 로 표기함.

- 함수적 종속은 데이터의 의미를 표현하는 것으로, 현실 세계를 표현하는 제약 조건이 되는 동시에 데이터베이스에서 항상 유지되어야 할 조건

 

 1) 완전 함수적 종속(Full Functional Dependency) : 결정자가 2개 이상의 속성으로 이루어져 있을 때, 결정자에 해당하는 속성 모두에 의해서 결정되는 종속자는 결정자에 완전 함수적 종속 이라고 함.

 2) 부분 함수적 종속(Partial Functional Dependency) : 결정자가 2개 이상의 속성으로 이루어져 있을 때, 결정자에 해당하는 속성 중 일부에 의해서 결정되는 종속자는 결정자에 부분 함수적 종속 이라고 함.

 

 

45강. 정규화(Normalization)

- 테이블의 속성들이 상호 종속적인 관계를 갖는 특성을 이용하여 테이블을 무손실 분해(Nonloss Decomposition)하는 과정

- 분해 후 다시 조인했을 때 원본 테이블과 동일할 경우 : 무손실 분해

- 정규화의 목적 : 가능한 한 중복을 제거하여 삽입, 삭제, 갱신 이상의 발생 가능성을 줄이는 것

비정규 릴레이션 -(도메인이 원자값)-> 1NF -(부분적 함수 종속 제거)-> 2NF -(이행적 함수 종속 제거)-> 3NF -(결정자이면서 후보키가 아닌 것 제거)-> BCNF -(다치 종속 제거)-> 4NF -(조인 종속성 이용)-> 5NF

 * 순서대로 정규화 정도가 높아짐

 

 1) 제 1정규형 : 테이블 R에 속한 모든 속성의 도메인(Domain)이 원자 값(Atomic Value)만으로 되어 있는 정규형

 

 2) 제 2정규형 : 테이블 R이 제 1정규형이고, 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형, 즉, 부분 함수적 종속 제거

  * 기본키가  복합키일 때, 예를 들어 (학번, 과목명)이 기본키일 때 (학번,과목명)->성적이지만 학번->학생 일 경우, 학번&학생 테이블을 별도로 분리하면 된다.

 

 3) 제 3정규형 : 테이블 R이 제 2정규형이고 기본키가 아닌 모든 속성이 기본키에 대해 이행적 함수적 종속(Transitive Functional Dependency)을 만족하지 않는 정규형

  * 이행적 함수적 종속 : A->B, B->C 일 때, A->C (A를 알면 C를 알 수 있다, A가 결정자, C가 종속자)

   - 이 때, A,B 와 A,C 테이블을 별도로 분리하면 된다.

 

 4) BCNF : 테이블 R에서 모든 결정자가 후보키(Candidate Key)인 정규형, 일반적으로 제 3정규형에 후보키가 여러 개 존재하고, 이러한 후보키들이 서로 중첩되어 나타나는 경우에 적용 가능

  * 결정자가 후보키가 아닌 속성을 그 속성의 결정자와 함께 분리하면 된다.

 

 5) 제 4정규형 : 테이블 R에 다중 값 종속(MVD; Multi Valued Dependency) A->->B(A에 따른 B의 값이 단일하지 않고 여러 개, 즉, 집합이 존재할 때)가 존재할 경우 R의 모든 속성이 A에 함수적 종속 관계를 만족하는 정규형

 

 6) 제 5정규형 : 테이블 R의 모든 조인 종속(JD; Join Dependency)이 R의 후보키를 통해서만 성립되는 정규형

  * 테이블을 3개 이상으로 분리했는데 조인 종속을 갖는 종속성들이 후보키가 아닌 것을 제거

 

 

46강. 반정규화(Denormalization)

- 시스템의 성능을 향상하고 개발 및 운영의 편의성 등을 높이기 위해 정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위(정규화의 반댓말이 아님!!)

- 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만 데이터의 일관성 및 정합성이 저하될 수 있음

- 과도한 반정규화는 오히려 성능을 저하시킬 수 있음

- 방법 : 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 속성 추가

 

1. 테이블 통합

- 두 개의 테이블이 조인되어 사용되는 경우가 많을 경우 성능 향상을 위해 아예 하나의 테이블로 만들어 사용하는 것

 1) 테이블 통합을 고려하는 경우

  - 두 개의 테이블에서 발생하는 프로세스가 동일하게 자주 처리되는 경우

  - 항상 두 개의 테이블을 이용하여 조회를 수행하는 경우

 2) 테이블 통합의 종류

  - 1대1 관계 테이블 통합, 1대다 관계 테이블 통합, 슈퍼타입/서브타입 테이블 통합

 

2. 테이블 분할

- 테이블을 수직 또는 수평으로 분할하는 것

 1) 수평 분할 : 레코드(Record)를 기준으로 테이블을 분할하는 것, 레코드별로 사용 빈도의 차이가 큰 경우 사용 빈도에 따라 테이블을 분할

 2) 수직 분할 : 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할

  - 종류 : 갱신 위주의 속성 분할, 자주 조회되는 속성 분할, 크기가 큰 속성 분할, 보안을 적용해야 하는 속성 분할

 

3. 중복 테이블 추가

- 작업의 효율성을 향상시키기 위해 테이블을 추가하는 것

 1) 중복 테이블을 추가하는 경우

  - 여러 테이블에서 데이터를 추출해서 사용해야 할 경우

  - 다른 서버에 저장된 테이블을 이용해야 하는 경우

 2) 중복 테이블 추가 방법

  - 집계 테이블의 추가 : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거(Trigger)를 설정하여 사용하는 것

  - 진행 테이블의 추가 : 이력 관리 등의 목적으로 추가하는 테이블

  - 특정 부분만을 포함하는 테이블의 추가 : 데이터가 많은 테이블의 특정 부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성

 

4. 중복 속성 추가

- 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것

- 중복 속성을 추가하면 데이터의 무결성 확보가 어렵고, 디스크 공간이 추가로 필요

 1) 중복 속성을 추가하는 경우

  - 조인이 자주 발생하는 속성인 경우

  - 접근 경로가 복잡한 속성인 경우

  - 액세스의 조건으로 자주 사용되는 속성인 경우

  - 기본키의 형태가 적절하지 않거나 여러 개의 속성으로 구성된 경우