Basics of Functional Dependencies and Normalization for RelationalDatabase

2020. 11. 21. 01:26데이터베이스

데이터 베이스 함수적 의존성과 정규화

데이터 베이스에 중복적인 데이터가 계속 쌓일경우 공간 낭비라는 부작용을 초래할 수 있다. 이러한 부작용에는 아래와 같은 것들이 있다. 또한 이러한 문제들을 해결하기 위해 정규화가 필요하다. 

 

1. 튜플안의 불필요하거나 중복된 데이터의 저장

2. 이상한 데이터의 값을 업데이트

  2.1 삽입 이상
  2.2 삭제 이상
  2.3 변경 이상

3. NULL 값이 튜플에 들어갔을 때 

 

위와 같은 상황에 부작용이 발생할 수 있다. 

 

1번과 2번의 상황을 해결하기 위해서는 스키마를 디자인할 때 이러한 일이 발생하지 않게 디자인해야한다. 또한 이러한 일이 발생했을 때 응용프로그램이 이를 고려할 수 있도록 기록하는 것이 중요하다. 

 

이와 같은 테이블이 있다고 생각해보자!

아래 테이블의 경우에는 Ssn과 ProjectID의 조합으로 PrimaryKey를 만들어주고 있다. 

Ename Ssn(PK) ProjectGrade Address ProjectID(PK)
김원우 10001 A 부산시 001
최은호 10002 B 구미시 001
참재 10004 C 개금 003
장성빈 10005 A 나는 자연이이다 촬영지 004
뀨뀨몬 10003 F 대구시 002
최은호 10002 A 구미시 002

 

 

2.1 삽입 이상

새로운 신입사원이 들어와서 새로운 데이터를 추가해야한다. 현재 ProjectID가 정해지지 않았기 때문에 NULL 값을 넣어 줄 수 없다. 이럴 경우 ProejctID에 프로젝트가 정해지지 않음 이라는 새로운 데이터를 추가해야한다. 

 

새로운 데이터를 삽입하기 위해 이전의 필요하지 않은 데이터도 함께 삽입 해야하는 문제를 삽입 이상이라고 한다. 

 

2.2 삭제 이상

뀨뀨몬이 현재진행 중인 프로젝트인 002를 그만두려고 한다.  그럼 뀨뀨몬의 데이터를 전부 삭제해야한다. 이때 같이 있는 다른 데이터까지 삭제해야 하기 때문에 문제가 발생한다. 

 

필요 없어진 데이터를 삭제하기 위해 꼭 필요한 데이터까지 함께 삭제하는 문제를 삭제 이상이라고 한다.

 

2.3 변경 이상

위의 경우에 최은호가 이사를 가려고한다 현재 구미시에서 부산광역시 해운대구로 이사를 가려고하는데 두개를 전부 바꾸지 않고 1개만 바꿀 경우 최은호가 구미시에 사는지 부산광역시에 사는지 알 수 없다. 이럴 경우 변경 이상이라고 한다.

 

중복된 튜플 일부분만 수정해서 데이터의 불일치가 발생한다. 이러한 문제를 변경 이상이라고 한다.

 

 

Functioncal Dependency

함수적 의존성에 대해 아래와 같이 표현할 수 있다. 

 

X -> Y
  • X는 결정자 Y는 종속자라고 할 수 있다. 
  • X가 Y를 함수적으로 결정한다. 
  • Y가 X에 함수적으로 종속되어 있다. 
Ename Ssn(PK) Bdate Address
김원우 10001 12.08 부산시
최은호 10002 11.12 구미시
참재 10004 05.05 개금
장성빈 10005 12.12 나는 자연이이다 촬영지
뀨뀨몬 10003 10.09 대구시

 

위의 경우에 예를 들어 함수적 의존성에 대해 설명해보겠습니다. 

 

위에서 한 사람을 고유하게 분리할 수있는 키는 Ssn이다. 즉 Ename, Bdate, Address는 Ssn에 함수적으로 종속적으로 되어있다고 할 수 있다. 여기서 Ssn은 결정자 Ename, Bdate, Address는 종속자가 되면 아래와 같은 표현으로 표시할 수 있다. 

 

Ssn -> (Ename, Bdate, Adrress)

 

Ename Ssn(PK) ProjectGrade ProjectID(PK)
김원우 10001 A 001
최은호 10002 B 001
참재 10004 C 003
장성빈 10005 A 004
뀨뀨몬 10003 F 002
최은호 10002 A 002

 

현재의 경우 프로젝트 ID와 프로젝트의 성적이 정해졌다. 여기서도 함수적 의존성에 대해 알아봅시다. 

 

Ssn -> Ename

{Ssn, ProjectID} -> ProjectGrade

{Ssn, ProjectID} -> Ename

 

  • 이름은 Ssn를 결정자로 이름을 고유하게 구분해낼 수 있다. 
  • 위와 다르게 ProjectGrade는 Ssn, ProjectID 만으로 PrjectGrade를 고유하게 구분해낼 수 있다. 
  • Ssn의 경우에도 Ename을 고유하게 구분할 수 있지만 Ssn, ProjectID만으로도 이름을 고유하게 구분해낼 수 있다. 

Ename의 경우에는 함수적 종속성을 두가지로 표현해낼 수 있다. 이럴 때 부분 함수적 종속성, 완전 함수적 종속성을 구분할 수 있다.

 

부분 함수적 종속성

부분 함수적 종속성은 X의 일부분으로 Y을 고유하게 구분할 수 있을 때를 의미한다. 

 

위의 경우에 {Ssn, ProjectID} -> Ename에서 X의 두개 중 일부인 Ssn 만으로 Ename을 구분할 수 있기 때문에 이를 부분 함수적 종속성이라고 한다. 

 

 

완전 함수적 종속성

완전 함수적 종속성에 대해서는 X의 전체로 Y를 고유하게 구분할 수 있을 때를 의미한다. 

 

{Ssn, ProjectID} -> ProjectGrade의 경에는 X의 일부분이 아닌 Ssn, ProjectID 두개를 합쳐서 사용해야 무조건 ProjectGrade를 고유하게 구분할 수 있다. 이럴 때 완전 함수적 종속성이라고 한다. 

 

 

데이터베이스 정규화 1NF, 2NF, 3NF

이전에 얘기했던 것과 같이 정규화란 중복을 최소화하고 이상이 일어나지 않게 데이터를 구조화하는 것을 데이터 베이스 정규화라고 한다. 

 

각종 정규형이 있는데 1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF 까지 있다. 

 

1NF

각 로우마다 칼럼의 값이 1개씩만 있어야한다. 이를 칼럼이 원자값을 갖는다고 의미한다. 

 

Ename Ssn(PK) ProjectGrade ProjectID(PK)
김원우 10001 A 001
최은호 10002 B 001
참재 10004 C 003
장성빈 10005 A 004
뀨뀨몬 10003 F 002
최은호 10002 A 002

위와 같이 각 도메인의 값이 한개씩만 존재하고 있다. 

 

아래와 같이 테이블을 변경하게 되면서 데이터를 추가했습니다. 모든 도메인이 1개의 값만 갖고 있어서 1NF를 지킬 수 있지만 중복을 최소화할 수 있습니다. 

Ename Ssn(PK) ProjectGrade ProjectID(PK)
김원우 10001 A 001
최은호 10002 B 001
참재 10004 C 003
장성빈 10005 A 004
뀨뀨몬 10003 F 002
최은호 10002 A 002

2NF

2차 정규형은 테이블의 모든 칼럼이 완전 함수적 종속성이어야 한다. 즉 위와 같이 부분 함수적 종속성을 가지면 안된다. 

 

Ename Ssn(PK) ProjectGrade ProjectID(PK)
김원우 10001 A 001
최은호 10002 B 001
참재 10004 C 003
장성빈 10005 A 004
뀨뀨몬 10003 F 002
최은호 10002 A 002

 

즉 위와 같은 경우에는 ssn의 경우에 Ename으로 값을 가져올 수 있지만 Ename, ProjectID둘의 조합으로 이름을 가져올 수 있다. 즉 이런 경우에 이름이 겹칠 수가 있다. 그래서 위와 같은 경우에는 테이블을 분리해야한다. 

 

Student

Ename Ssn(PK) ProjectID(PK)
김원우 10001 001
최은호 10002 001
참재 10004 003
장성빈 10005 004
뀨뀨몬 10003 002

Project

Ssn(PK) ProjectGrade ProjectID(PK)
10001 A 001
10002 B 001
10004 C 003
10005 A 004
10003 F 002

이렇게 나누어준 경우 이상의 문제를 겪지 않게 되지만 복잡한 테이블을 겪게 될 경우 겪을 수도 있습니다. 이러한 문제를 완벽히 해결한 것이 3NF이다. 

 

3NF

기본키가 아닌 모든 속성이 기본키에 이행적 함수에 종속되지 않으면 제 3 정규형이라고 한다. 여기서 이행적 함수 종속이라는 것이 무엇일까?  X -> Y -> Z를 통해서 각각의 칼럼이 연결되어 데이터가 나타낼 수 있는 것이다. 

 

사원 이름 -> 사원 번호 -> 프로젝트 ID

 

(사원 이름, 사원 번호)와 (사원 번호, 프로젝트 ID)로 구분할 수 있다. 

 

Ename Ssn(PK)
김원우 10001
최은호 10002
참재 10004
장성빈 10005
뀨뀨몬 10003

 

Ssn(PK) ProjectID(PK)
10001 001
10002 001
10004 003
10005 004
10003 002

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

복잡한 쿼리, 트리거, view, 스키마 변경  (5) 2020.10.14
Relation Data Model and Constraints  (0) 2020.09.30
ER(Entity Relation) 모델  (0) 2020.09.23