Database - 7.1 Normalization

Mingi Shin·2023년 6월 15일
0

Database

목록 보기
10/16
post-custom-banner

ER schema를 테이블로 매핑하고 나면 Update anomalies(갱신 이상)에 직면한다.

Normalization(정규화)는 Functional dependency(함수적 종속성)과 pk를 바탕으로 relation schema를 분석함으로써 3가지 갱신 이상을 해결하고 중복을 최소화한다.


📌 Intro

좋은 데이터베이스 스키마란 무엇인가.

중복, 갱신 이상, data loss를 방지하고
구현하고자 한 real world를 잘 나타내고
attribute 간의 관계를 보장하고
무결성 제한 조건을 지키며
효율적이어야 한다.

📙 Update anomaly(갱신 이상)

Modification anomaly(수정 이상)

  • 튜플을 수정할 때, 데이터 일관성이 깨진다.
  • 튜플을 수정할 때, 무수한 중복으로 인해 전체를 뒤지며 수정해야 한다.

Insertion anomaly(삽입 이상)

  • 튜플을 삽입할 때, 불필요한 정보도 같이 삽입해야 한다.

Deletion anomaly(삭제 이상)

  • 튜플을 삭제할 때, 중요 정보도 함께 삭제해야 한다.

📙 Bad design 예시

EMPLOYEE relation처럼 디자인이 되어있다고 가정하자. EMPLOYEE는 최대 2개 부서에 소속될 수 있다.

Y.PARK 직원을 보면 1개 부서에 소속되어 있지만 DNO2, DNAME2에 널값을 주어야만 튜플을 삽입할 수 있다.(삽입 이상)

삽입 이상으로 인해 7.1그림의 테이블을 7.2그림의 테이블로 대신했다고 했을 때, 각 직원의 부서 최대 개수 제한 요구 사항의 의미가 사라진다.

중복

  • 직원 튜플이 직원이 속한 부서의 수이기 때문에 EMPNAME, EMPNO, ADDRESS, TELEPHONE이 그만큼 중복된다.

수정 이상

  • 부서의 이름을 바꿀 때, 해당 부서에 속한 일부 직원 튜플에서만 그 이름을 변경한다면 데이터 일관성이 깨져버린다.

삽입 이상

  • 새로운 부서가 생성되었다고 했을 때, 해당 부서에 아직 아무도 없다면 부서 정보를 삽입할 수 없다.

삭제 이상

  • 어떤 부서에 직원이 한 명만 있다고 할 때, 그 직원 삭제하면 부서 정보도 같이 날라간다.

📙 Relation decomposition

필요시 분해된 relation으로부터 original relation을 보장해야 한다는 원칙을 지키며 하나의 relation을 2개로 쪼갠다.

쪼개진 테이블의 정보의 양은 원래의 테이블에서 변동될 수 있지만 정보는 일치해야 한다.

테이블 분할은 테이블 내에 존재하는 함수적 종속성에 기반한다.

7.3으로 변경했을 때 갱신 이상은 해결된다.

  1. 수정 이상
    2, 3번 부서와 같이 여러 명의 직원이 소속되어 있어도 DEPTNAME field가 EMPLOYEE 테이블에 포함되어 있지 않기 때문에 수정 이상이 발생하지 않는다.

  2. 삽입 이상
    삽입할 새로운 부서에 소속 직원이 없더라도 DEPARTMENT 테이블의 pk는 DEPTNO이기 때문에 DEPARTMENT 테이블에 새 부서 정보를 삽입할 수 있다.

  3. 삭제 이상
    소속 직원이 한 명인 부서에서 해당 직원을 삭제하더라도 부서의 정보는 DEPARTMENT 테이블에 남아 있기 때문에 사라지지 않는다.

그러나 두 개의 부서일 경우 두 개의 튜플이 삽입되어 중복되기 때문에 1NF를 만족하지는 않는다.

📙 정규화 단계

first normal form(제 1정규화)

  • 속성은 원자값을 가져야 한다.

second normal form(제 2정규화)

  • 부분 함수 종속성을 제거한다.

third normal form(제 3정규화)

  • 이행적 함수 종속성을 제거한다.

BCNF(Boyce-Codd normal form)

  • 결정자가 후보키가 아닌 것을 제거한다.

fourth normal form(제 4정규화)
fifth normal form(제 5정규화)

profile
@abcganada123 / git:ABCganada
post-custom-banner

0개의 댓글