정규화는 DB를 사용하는 개발자라면 꼭 필요한 부분입니다. 같이 한번 알아봐요!!
저는 코딩 애플님 영상을 보면서 공부해봤습니다.
https://www.youtube.com/watch?v=Y1FbowQRcmI&t=338s&ab_channel=%EC%BD%94%EB%94%A9%EC%95%A0%ED%94%8C
정규화?
정규화는 관계형 DB의 설계과정중에 중복을 최소화하도록 구조화하는 작업입니다. 정규화의 목표는 이상이 있는 관계를 재구성해서 작조 잘 조직된 관계에 생성하는 것입니다. 정규화는 단계로 구별되고 이 정규형이 높아질수록 대부분은 이상현상이 줄어들게 됩니다.
장점
정규화는 무엇이 좋기에 과정을 거치는 것일까요?
- DB 변경시 이상현상 해소를 위한 값 변경이 쉽다.
- 데이터가 추가되더라도 구조를 변경하지 않아도 되거나, 일부만 변경해도 된다.
등등 여러 장점이 있습니다.
이제 단계별 정규형을 알아봅시다.
제 1 정규형
제 1정규형은 다음과 같은 규칙을 가집니다.
- 각 컬럼이 하나의 속성만을 가져야 한다
- 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다
- 각 컬럼이 유일한(unique) 이름을 가져야 한다
- 칼럼의 순서가 상관없어야 한다
위 테이블에서는 무엇이 규칙과 맞지 않을까요??
(각 컬럼이 하나의 값(속성)만을 가져야 한다. X)
각 칼럼은 속성값을 하나만 가져야한다는 것을 어기고 작성되어있습니다.
따라서 아래와 같이 작성될 것같습니다.
이렇게 구성하게 되면 값 수정에도 하나의 값을 수정하면 되는 것이니 좀 더 수월해지겠네요.
제 2정규형
제 2정규형은 1정규형에 부합하면서 기본키에 속하지 않는 속성이 모두 기본키에 완전 함수 종속인 정규형입니다.
말하자면 "모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다" 입니다.
위와같은 테이블에서는 동작이 문제없을 것같아 보입니다. 1정규형도 만족하구요.
그러나 "모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다."는 점을 만족하고 있지 않습니다.
위 항목을 보면 누군가의 성적 특정 값을 알기 위해서는 학생번호, 과목이 있어야합니다. (103번의 C언어 성적 70)
그에 반해 교수는 과목명만 알면 어느 교수의 강의 인지 알 수 있죠.
따라서 현재 교수 칼럼은 현재 테이블의 기본키인 학생번호와 과목에 종속적이지 않고 과목애먼 종속되고 있는 부분 종속에 해당됩니다. 어떻게 변경해줘야 할까요??
저는 그래서 테이블을 나눠 기본키인 과목을 지도교수가, 기본키(학생번호와 과목)를 성적이 종속되도록 했습니다.
이렇게되면 테이블은 1정규형을 만족하면서 완전 종속인 2정규형를 만족하네요.
제 3정규형
제 3정규형도 마찬가지로 2정규형을 만족해야합니다. 또한 기본키를 제외한 속성들 간 이행적 종속성이 없어야 합니다.
여기서 이행 종속성이란 테이블에 A,B,C가 존재할 때, A->B, B->C가 성립하면 A->C 또한 성립하는게 이행 종속성입니다.
여기서 이행적 종속이란?!
A->B, B->C 에 관계에서 A->C를 알게되면 어짜피 A->B, B->C 관계에서 알고있는 내용을 A->C에서 또 고려하기 때문에 불필요한 관계를 맺게 되는 것이라 이행적 종속의 문제라고 합니다!
여기서 보면 현재 3가지 칼럼이 존재합니다. 학생번호, 지도교수, 학과
그런데 잘보면 뭔가 보이시나요?
학생번호별로 정해져있는 지도교수, 지도교수님의 학과, 학생번호->학생의 학과
이행 종속성을 성립하고 있습니다!! 그럼 어떻게 해줘야할까요,
위와같이 테이블을 분리하게되면 더이상 학번에서 학과로 종속되지 않게 됩니다. 이렇게 되면 3정규형도 만족을 하게되겠죠.
BCNF
BCNF는 3정규형을 강화한 버전입니다. 당연히 3정규형을 만족해야하면서 모든 결정자가 후보키 집합에 속해야합니다.
여기서 결정자란?!
'X→Y' 일 때 X는 결정자, Y는 종속자이다.'학생→학번' 일 때 학생은 결정자, 학번은 종속자이다.
3정규형 예시를 가져와보겠습니다.
위 테이블을 보면 현재 학생이 지도교수의 무슨과목을 듣고있는지는알 수 있지만 같은 과목을 다른 교수가 가르치고 있는 상황이라면 현재 테이블만 가지고는 알 수 없습니다. 그렇게 되면 과목->지도교수의 종속은 성립할 수 없게 되지요.
하지만 지도교수는 본인이 어떤 과목을 가르치는지 알 수 있으므로, 테이블을 나누어 BCNF 정규형을 만족하도록 해야합니다.
이와 같이 분해하면 모든 결정자가후보키 집합에 속하기 때문에 BCNF를 만족한다고 볼 수 있습니다.
'나의 공부' 카테고리의 다른 글
JPA의 N+1 문제와 해결 (0) | 2023.04.12 |
---|---|
프로세스, 스레드, 멀티 스레드? (0) | 2023.04.06 |
디자인패턴-싱글톤패턴(SingleTon) (0) | 2023.03.23 |
디자인패턴-빌더 패턴(Builder) (0) | 2023.03.23 |
JSON 파일 쓰기/저장 (json-simple) (0) | 2023.03.02 |
댓글