컴퓨터/정보처리기사 DB

| 니앙팽이 - DB | 2 | DB 정규화 Normalization

no title

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

    X={empl_id}X = \{empl\_id\}
    Y={empl_name,birth_data,position,salary}Y = \{empl\_name, birth\_data, position, salary\}

  • Functional Dependency의 어원을 살펴보면

    • 수학에서 함수(function)가 Input이 같으면 Output이 같다. 따라서 Key에 따라 집합이 같다 이므로..
      -쉬운코드-

  • 그렇다면 DB테이블(테이블(릴레이션))에서 FD에 대입해보자면

    • XYX \rightarrow Y

      1. XX :Key집합 (Input) 가 같다면, YY:CoFiAtt 집합 (Output) 값도 같다.
      2. XX 가 함수적으로 YY를 결정한다
      3. YY 는 함수적으로 XX에 의존한다.
      -쉬운 코드-

  • FD는 하나의 테이블(테이블(릴레이션))에서도 여러가지가 있다.

    1. {stu_id}{stu_name,birth_data,address}\{stu\_id\} \rightarrow \{stu\_name, birth\_data, address\}
    2. {class_id}{class_name,year,semester,credit}\{class\_id\} \rightarrow \{class\_name, year, semester, credit\}
    3. {stu_id,class_id}{grade(성적)}\{stu\_id, class\_id\} \rightarrow \{grade(성적)\}

② Partial Functional Dependency : 부분 함수 종속

  • when XYX \rightarrow Y holds(존재한다면),
    if any Proper Subset(진 부분집합) of XX' can determine YY',
    then XYX \rightarrow Y is partial FD

    • Proper Subset : 진 부분집합
          > X = {a, b, c} 의 진 부분 집합은
          > {}, {a},{b},{c}, {a,b}, {a,c}, {b,c}
      
  • 예시로 {empl_id,empl_name}\{empl\_id, empl\_name\}을 Key로 사용하면 {birth_date}\{birth\_date\}를 결정할 수 있다.
    근데 잘 생각해보면 {empl_id}\{empl\_id\}으로도 {birth_date}\{birth\_date\} 를 정의할 수 있다.
    그런 점에서 이 테이블(테이블(릴레이션))은 부분 함수 종속이 존재한다고 할 수 있다.

  • 만약, 이 진부분 집합들 각각들이 전부 하나의 집합을 결정하지 못하는 경우가 있다,
    즉, 수퍼셋을 Key로 사용해야지만. 결정이 가능할때, Fully Partial FD 라고 한다.

③ Transitive Functional Dependency : 이행 함수 종속

  • when XY&YZX \rightarrow Y \& Y \rightarrow Z Holds, then XZX \rightarrow Z is Transitive FD
    unless either YY or ZZ is NOT subset of any key
    (모든 Non-Prime Attribute 는 어떤 key에 Transitive dependent하면 안된다.)


3. DB 정규화

# 도부 이결 다조?!! 🤣

1. 정의

  1. 데이터 베이스의 구조를 정의하는데 사용된다.
  2. D.비이상 삽살개를 해결해준다.
  3. 아무튼 이걸 해서 테이블(테이블(릴레이션))을 쪼개고 쪼개고 한다.

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 XYX \rightarrow YXX 가 super key여야 한다.
즉, X가 슈퍼키가 되게끔 만들던지,
그렇게 못한다면 테이블(테이블(릴레이션))을 분리하면 된다.


참조

  1. 홍달쌤
  2. 정미나 : 정규화
  3. DB 스키마 테이블(테이블(릴레이션)) 설계가 잘못되면 어떤 문제가 생길까요?
  4. Functional Dependency
  5. DB 정규화 1NF, 2NF
  6. DB 정규화 3NF, BCNF
  7. 관계형 데이터베이스(relational database)개념과 relation, primary key(기본키), foreign key(외래키), constraints를 알아봅시다