개발자 끄적끄적

함수의 종속성과 정규화 본문

데이터 베이스

함수의 종속성과 정규화

햏치 2023. 5. 16. 00:51

<함수적 종속성>
- 실행 예
S(S#, SNAME, STATUS, CITY) //제품
  PRIMARY KEY(S#)

P(P#, PNAME, COLOR, WEIGHT, CITY) //공급자
  PRIMARY KEY(P#)

SP(S#, P#, QTY) 
  PRIMARY KEY(S#, P#)
  FOREIGN KEY(S#)REFERENCES S
  FOREIGN KEY(P#)REFERENCES P




<기초적 정의들>
SCP 테이블
S#   CITY       P#    QTY
S1  LONDON  P1   100
S1  LONDON  P2   100
- R을 릴레이션이라고하고 X와 Y를 R의 속성 집합의 임의의 부분 집합이라고 하자
  그러면 'X가 Y에 함수적으로 종속' 되기 위한 필요 충분 조건은 R에 있는 각각의
  X 값이 R에 있는 정확히 하나의 Y값과 관련을 갖는 것이다

- 이를 기호로 표현하면 다음과 같다
  X -> Y("X가 Y를 함수적으로 결정한다")

- 시간 : 독립적인 의미

- SCP를 위한 무결성 제약조건

- X가 릴레이션 R의 후보키일 떄,
  만일 X가 기본키라면 R의 모든 속성 Y는 X에 함수적으로 종속되어야 한다
  - 후보키의 정의
  - 예
    P# -> {P#, PNAME, COLOR, WEIGHT, CITY}

- R이 FD A->B를 만족하고 A가 후보키가 아니면, R은 어떤 종류의 중복(redundancy)을 포함하고 있다
  - SCP : S# -> CITY





<소개>
- 훌륭한 설계 윈칙
  - 한가지 사실은 한 곳에서만 나타난다
  - 중복성 배제

- 정규화의 주제는 이와 같은 간단한 원리를 보다 형식화한 것
  - 이 영역은 데이터 베이스 설계 영역에서 매우 실제적은 영역이다

- 정규화
  - 특정 릴레이션이 정규화되어도, 여전히 바람적이지 못한 성질들을 가지고 있고, 보다 바람직한 형태로 바꾸어 줄 수 있다

- 정규형
  - 특정 제약 조건 집합을 만족한다면 
  - ex) 스칼라 값(원자값)만을 포함한다면 1NF(Nomal Form->제1 정규형)

- 정규형
  - 전체 릴레이션(정규화 혹은 비정규화된(비정규화는 데이터베이스가 아닌 파일에 가깝다))
   - 1NF릴레이션(정규화된 릴레이션)
    - 2NF릴레이션
     - 3NF릴레이션
       - BCNF릴레이션
         - 4NF릴레이션
          - 5NF릴레이션
*"정규화되다"와 "1NF"은 정확히 같은 의미를 갖는다

- 정규화 과정
  - 주어진 릴레이션들의 모임을 더 바람직한 어떤 형태로 점차 유도해가는 과정
  - 과정은 가역적이다(ex. 2NF -> 3NF)
    - 어떠한 정보도 잃지 않는다

- 이 장의 구조
  - 무손실 분해
  - FD의 결정적인 중요성
  - 대안적 분해(특정 릴레이션의 최선이 분해를 선택)





<무손실 분해와 함수적 종속성>
- 무손실(무손실 분해)
  - 이 과정이 특정 릴레이션을 다른 릴레이션들로 분해하는 것을 포함하고 있음을 보았는데 더욱이 이 분해는 과정 중에 정보의 손실을 막기 위해 가역적이어야 할 필요가 있다
  - 특정 분해가 무손실 인지의 문제는 함수의 종속성의 개념과 친밀하게 맺어져있다

- 정확하게 무엇 때문에 첫 번째 분해는 무손실이 되고, 두 번째 분해는 손실이 되었는가?
  - 분해
    - 프로젝션의 과정(테이블을 쪼개기)
 
- 가역성
  - 최초의 릴레이션이 프로젝션을 조인한 것과 동일
  - 프로젝션 : 정규화 과정에서 분해 연산자
  - 조인(자연 조인(Natural join)) : 재결합 연산자

 




<함수적 종속성(functional dependence)의 개념>
- 특정 릴레이션 안에서 하나의 속성 집합에서 다른 속성으로의 다대일 관계
- 항상 만족된다(satisfied all times)





<함수적 종속성에 대한 추가적인 내용>
- 좌변 최소성 FDs
  - 어떤 FD가 좌변 최소성이 있다는 것은 좌변이 "너무 크지 않다"는 것을 으미ㅣ
  - In SCP,
    - {S#, P#} -> CITY != S# -> CITY
    - CITY는 S#에 최소성으로 종속되어 있고, {S#, P#}에는 최소성으로 종속되어있지 않다
 
- FD-다이어그램
  - R은 릴레이션이고, I가 R에 적용되는 FD들의 최소성 집합이라고 하자

-   S#(기본키) 
    -> SNAME, STATUS, CITY

  S#, P#
  -> QTY

  P#
  -> PNAME, COLOR, WEIGHT, CITY
  후보키로부터의 화살표(실제는 기본키) : 각각의 후보 키가 갖는 어떠 한 값에 대응하여 나머지 속성들의 하나의 값이 항상 존재한다(화살표는 결코 삭제될 수 없다)
  만일, 그 밖의 다른 화살표들이 있으면, 문제가 발생한다. 따라서 정규화의 과정은, 매우 약식으로, 후보 키에서 나오지 않는 화살표들을 제거하는 과정으로 특정 지울 수 있다


- FD는 의미적 개념 
  - FD를 인식한다는 것은 데이터가 무엇을 의미하는 지 이해하는 과정의 일부분이다(ex. FD S# -> CITY)
  - 데이터베이스가 표현하고 있는 실세계에는, 각각의 공급자는 정확히 한 도시에만 있어야 한다는 제약 사항이 있다
  - 이 제약은 그 상황에 대한 의미의 일부분이므로, 데이터베이스 내에서 어떻게든 관찰되어야 한다
  - 이렇게 관찰된 것들을 보장하는 방법은 이 제약을 데이터베이스 정의에 기술해 넣은 것이며, 이렇게 함으로써 DBMS가 제약을 따르도록 하게 할 수 있다
  - 데이터베이스 정의에 기술하는 방법은 FD를 선언하는 것이다






<제 1,2,3 정규형>
- 간단함을 위한 과정
  - 각각의 릴레이션이 정확하게 하나의 후보키를 갖는다 //기본키만 있다고 가정

- 제 3정규형(비형식적인 정의)
  어떤 릴레이션이 3NF이라는 것은, 키가 아닌 모든 속성들이
  (1) 상호 독립적이며, 
  (2) 기본 키에 최소성으로 종속됨을 의미한다

  - 키가 아닌 속성은 해당 릴레이션의 기본 키에 참여하지 않는 속성이다
  - 두 개 이상의 속성 중 어느 것도 다른 것들의 조합에 함수적으로 종속되지 않으면, 이들 속성은 상호 독립적이다. 이 독립성은 그러한 각각의 속성이 나머지와 독립적으로 갱신될 수 있다는 것을 함축하고 있다

- 정규화 과정
 - 제1 정규형
    - 어떤 릴레이션이 1NF이기 위한 필요 충분 조건은, 모든 도메인이 스칼라 값만을 포함하는 것이다
  - 모든 정규화된 릴레이션이 1NF라는 것을 말한다
  - First(S#, STATUS, CITY, P#, QTY)
    PRIMARY KEY(S#, P#)
    S#가 함수적으로 결정(최소성) -> CITY, STATUS

- 이상(anomailes)
  - (ex. supplier-city 중복성 : FD S# -> CITY)

- 삽입 이상
  - 특정 공급자가 적어도 하나의 부품 이상을 공급하지 않는 한 그 공급자가 특정 도시에 거주한다는 사실을 기록할 수 없다
  - 어떠한 기본값도 null일 수 없다

- 삭제 이상
  - 릴레이션에서 특정 공급자 튜플을 삭제하려고 할 때, 그 공급자와 공급 부품과의 관계뿐만 아니라, 공급자가 거주하는 도시에 관한 정보도 함께 소실
*해결 : 분리과정 -> "분리된 정보는 분리된 릴레이션에 위치 시킨다"

- 갱신이상
  - 일반적으로, 특정 공급자에 대한 도시 명이 릴레이션에서는 여러 번 나타난다 -> 중복성
 

- FIRST를 SECOND와 SP로 분해한 효과가
  - 비최소성 중복성들을 제거하는데 나타났음을 알 수 있다

- 동일 릴레이션에 두 가지 정보를 섞어 놓으면
  - 앞에서 언급한 문제가 발생한다(삽입이상, 삭제이상, 갱신이상)
  
- 릴레이션이 2NF라는 것은
  - 1NF
  - 키가 아닌 모든 속성이 기본 키에 최소성으로 종속되는 것이다
    - ex)SECOND, SP : 2NF
  - ex)FIRST : 1NF이지만, 2NF는 아니다

- 정규화 과정에서의 첫 단계
  - 프로젝션을 취하여 "비최소성" 함수적 종속성을 제거한다
  - 릴레이션 R이 주어졌을 때,
    R(A, B, C, D)
    PRIMARY KEY(A,B)
    A->D
 
  - R을 두 개의 프로젝션 R1와 R2로 대치
    R1(A,C)
      PRIMARY KEY(A)
   R2(A,B,C)
    PRIMARY KEY(A,B)
    FOREIGN KEY(A) REFERENCES R1

- SECOND릴레이션
   - 키가 아닌 속성간의 상호 독립성이 보장되지 않았다
    (FD CITY -> STATUS)
  - 이행적 종속성 
     - 갱신이상을 초래한다
      - A->B와 B->C가 모두 성립하면, A->C도 성립한다 
      - ex)S# -> CITY -> STATUS

- SECOND릴레이션의 이상(CITY-STATUS의 중복성) 
  - SECOND(S#, STATUS, CITY)
 
- 제3정규형
  - 오직 하나의 후보키(기본키)
  - 릴레이션에서 3NF라는 것은 
    - 2NF
    - 모든 키가 아닌 속성들이 기본 키에 비이행적으로 종속된다
  - SC, CS : 3NF
 - SECOND : 2NF이지만, 3NF는 아니다

- 정규화 과정에서 두 번째 단계
  - 는 프로젝션을 취해 이행적 종속성을 제거하는 것이다
  - 릴레이션 R이 주어졌을 때
    R(A,B,C)
      PRIMARY KEY(A)
      B->C
  - R을 다음과 같이 두 개의 프로젝션 R1과 R2로 대체한다
     R1(B,C)
      PRIMARY KEY(B)
   R2(A,B)
    PRIMARY KEY(A)
    FOREIGN KEY(B) REFERENCES R1
   - 정규화
       - 데이터 값의 문제가 아니라 의미의 문제

'데이터 베이스' 카테고리의 다른 글

트랜잭션(transaction)  (0) 2023.05.27
데이터베이스 설계  (0) 2023.05.01
물리적 저장구조와 인덱스  (0) 2023.04.23