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 |