1. DB 설계가 중요한 이유
객체지향 프로그래밍에서 적절한 객체가 설계돼 있지 않다면 그에 대한 조작인 멤버함수나 메서드는 복잡해질 것이며 응용프로그램의 로직도 잘 표현할 수 없을 것이다.
RDB도 똑같다. 데이터의 조작인 쿼리는 DB에 포함된 각 테이블이 적절히 설계돼 있지 않으면 깔끔하게 표현할 수 없다.
그래서 필요한 것이 정규화 이론이다
2. 정규화 ( 관계형 모델을 보완하는 이론 )
사용이유
1. 변칙을 방지할 수 있다. ( 논리적 모순이 발생하여 답이 나올 수 없는 구조 )
- 릴레이션의 설계가 상식적이지 않을 때 발생
- 중복때문에 발생
정규형 (NF)
정규화에는 몇 가지 단계가 있는데 높은 단계로 갈수록 더 좋은 상태가 된다. ( 중복이 적은 상태 )
함수 종속성( FD )
정의 : 어떤 릴레이션 R이 있고, 제목의 부분집합두 개를 A, B라고 하자. 릴레이션 R의 모든 튜플이 A의 값이 같다면 B의 값도 같은 경우가 있을 수 있다. 이 경우에 한해서 B는 A에 함수 종속한다고 하고, 이라헌 관계성을 A->B라고 기술 한다.
" A의 값을 알면 B의 값을 할 수 있다" 는 의미
이 정의에 의해서 필연적으로 도출되는 함수종속성을 자명한 함수 종속성이라고 한다.
정규화의 의미는 자명하지 않은 함수 종속성을 없애는 것이다.
종류 - 특성 ( 특성 높은 단계의 정규형은 자동으로 낮은 정규형의 조건을 만족 )
◆ 제 1정규형
1NF를 하기 위한 요건은 "릴레이션이어야 할 것"이다. -> SQL의 조건
테이블이 1NF가 되기 위한 요건 -> 관계형 DB
- 행이 위에서 아래로 정렬돼 있지 않다. => 의존하지 않는다는 의미
- 열이 왼쪽에서 오른쪽으로 정렬돼 있지 않다. => 의존하지 않는다는 의미
- 중복하는 행이 존재하지 않는다. -> 기본키나 유니크 키를 부여하면 된다.
- 각 행과 열의 교차점은 도메인에 속하는 요소의 값을 딴 한개만 가진다.
- 모든 열의 값은 정의된 것이어야 하고 각 행은 항상 존재한다. (Null 이 있다면 테이블을 나누자)
후보키 : 그 릴레이션에 포함된 튜플의 값을 고유하게 하는 속성의 집합 ( 더는 속성을 줄일 수 없는 상태 )
수퍼키 : 후보키에서 추가 속성을 가지는 키
◆ 제 2정규형
후보키의 진부분집함에서 키가 아닌 속성에 함수 종속성을 제거하는 작업. 이때 부분 함수 종속성은 부분집합 중에 원래 자신의 집합을 제외한 것이다.
즉 릴레이션이 1NF이며 부분 함수 종속성을 갖지 않으면 그 릴레이션은 2NF가 된다.
위의 그림을 보면 각각의 행과 열은 종합적으로는 다르지만 같은 학번에 같은 등록금을 가지는 형태를 볼 수있다. (모순 발생 )
무손실 분해
한 개의 릴레이션을 여러 개의 릴레이션으로 분해하는 작업 ( 프로젝션 ) 이때 원래 릴레이션의 정보를 잃어버리지 않게 두 개의 릴레이션으로 분해하는 것을 무손실 분해라고 한다.
◆ 제 3정규형
- 추이 함수 종속성이라는 함수종속성을 제거하는 작업
- 추이 함수 종속성: 키가 아닌 속성 사이의 함수 종속성으로 아래와 같이 나타낼 수 있다.
◆ 보이스코드 정규형
- 자명하지 않은 함수 종속성이 모두 제거된 상태의 정규형
후보키 내부에 자명하지 않은 함수 종속성은 존재하지 않는가?
자명하지 않은 함수 종속성의 세가지 패턴
- 후보키의 진부분집합 -> 키가 아닌 속성
- 키가 아닌 속성 -> 키가 아닌 속성
- 키가 아닌 속성 -> 후보키의 진부분집합
BCNF까지 진행했다면 자동으로 5NF의 조건을 만족하는 경우가 많고 여기까지의 지식만으로도 충분히 위력을 발휘한다.
하지만 함수 종속성만으로는 한계에 이른다. 그래서 결합 종속성이라는 개념을 알아야한다. 다음 글에는 결함 종속성과 4~6 NF를 설명하겠다.
'DB > 관계형 DB' 카테고리의 다른 글
릴레이션 직교성 (0) | 2021.01.18 |
---|---|
정규화 논리 (결합 종속성) #(제 4정규형 ~ 제 6정규형) (0) | 2021.01.11 |
procedure (0) | 2020.12.29 |
mysql - CRUD 작업하기 (0) | 2020.12.28 |
MYSQL 사용법 (0) | 2020.12.27 |