작성하다가 날라갔다. 그래서 다시쓴다 괜찮다. 난 강하니까..
다시 복습한다고 생각하자..
정규화는 관계형 데이터 모델이서 데이터의 중복성을 제거하여 이상 현상을 방지하고, 데이터의 이로간성과 정확성을 유지하기 위해 무손실 분해하는 과정이다.
*이상현상 : 데이터의 중복성으로 인해 릴레이션(행과 열로 구성된 테이블)을 조작할 때 발생하는 비합리적 현상이다. 삽입 이상, 삭제 이상, 갱신 이상 등이 있다.
제1정규형, 1정규형, 제1정규화, 1정규화, 1NF 모두 같은 말임을 알고가면 혼동을 조금 줄일 수 있다.
위 와같은 테이블이 있다고 해보자. 김민수는 프로그램에 두 개의 데이터를 가지고 있다.
하지만 데이터를 이렇게 저장하게 되면 단점이 있다.
조건을 작성하기 번거로워짐, WHERE 프로그램 LIKE '%골프초급%' 과 같이 작성해야하고, 검색시 성능면에서도 좋지 않음
프로그램명을 수정하기 어려워짐.프로그램 명이 변경될 일이 있을 수 있음. 이때 값이 이렇식으로 두 개이상 묶여 있다면 수정이 굉장히 곤란해짐
이러한 단점들은 보완하기 위해 아래와 같이 테이블을 수정해준다.
이처럼 하나의 칸 안에 하나의 값만을 넣도록 하는 것을 "원자값으로 구성했다" 라고 하며 이것이 적용된 테이블을 "제1정규형을 만족하는 테이블"이라고 한다.
제2 정규화는 쉽게 말해 "현재 테이블의 주제와 관련없는 칼럼을 다른 테이블로 빼는 작업"이라고 할 수 있겠다.
조금더 자세히 말하자면 제2정규형은 partial dependency를 제거한 테이블이다.
Composite Primary key라는 것이 있다. 이것은 1차 정규형을 만족하게 작성하였을 때, 대개 PrimaryKey로 사용할 만한 칼럼이 그 역할을 못하게된다. 예를들어 아래 표에서 1차 정규형을 만족하지 않았다면, 회원번호가 primarykey가 돼도 됐을텐데, 1차 정규형을 진행하였으므로 103번이 두개 등장하여 primarykey의 역할을 할 수 없게 되었다. 이때 회원번호와 프로그램을 엮어서 primarykey로 사용할 수 있는데, 이것을 Composite Primary key 라고 한다.
여기에서 한번 보자. 가격 컬럼은 프로그램에 따라서만 결정이된다. 나머지 컬럼은 영향을 미치지 않는다. 즉 하나의 컬럼에만 종속이 되어있따는 것이다. 이러한 경우에 "가격이라는 컬럼은 프로그램이라는 컬럼에 partial dependency가 있다"라고 말할 수 있는 것이다.
즉즉즉! composite primary key들 중! 하나에만! 종속관계를 보이는 것! 그것을 다른 테이블로 빼버리는 것이 제 2 정규형이다.
: 가격을 수정할 일이 있다고 할 때, 기존 같으면 해당하는 모든 row를 일일이 다 수정해줘야겠지만, 제2정규형을 시켜놓으면, 한 곳만 수정하면 됨.
: 누가 얼마나 돈을 내는지 알아보려면 다른 테이블도 참조해야만 가능하기 때문에 나중에 조회할 때 번거로울 수 있음. 이러한 요인들 때문에 정규화를 사용하지 않는 비관계형 DB도 등장하게 되었음.
2정규형의 개념을 이해했다면, 3정규형은 쉽게 이해할 수 있다.
아래의 표는 particial dependency가 없다. 애초의 composite primary key 자체가 없기 때문이다. 이러한 테이블에서 현제 출신대한이라는 컬럼은 프로그램(primarykey)와는 아무 관계과 없다. 그저 강사라는 컬럼에 종속되어 있을 뿐이다.
이처럼 제2정규화랑 달리, particial dependency가 없으면서 primarykey가 아닌 어떠한 칼럼에 종속되는 형태를 보일때 이것을 다른 테이블로 따로 빼주는 것을 제3정규형이라고 한다.
: 제2정규화와 마찬가지로 수정이 편리해짐
: 제2정규화와 마찬가지로 강사의 출신대학을 알아보려면, 다른 테이블을 같이 참조해야함.
결정자란?
어떤 애트리뷰트의 값이 다른 애트리뷰트의 값을 고유하게 결정할 수 있음. 결정자는 주어진 릴레이션에서 다른 애트리뷰트를 고유하게 결정하는 하나 이상의 애트리뷰트를 의미함. 결정자는 키 애트리뷰트이거나 아닐수도 있고, 복합 애트리뷰트일 수 있음
A가 B를 결정하는 결정자라고 하면 A->B로 표현함
후보키란?
릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합, 즉 기본키로 사용할 수 있는 속성들을 말한다.
아래의 표에서는 <학번, 과목명>이 <교수명>에 영향을 주고, <교수명>이 또 <과목명>에 영향을 주는 관계이다. <교수명>이 <과목명>에 영향을 주지만(결정자) 키는 아닌 상황이므로, <학번, 과목명,교수명>을 한 테이블에 두는 것은 <교수명>이 결정자이지만 후보 키가 아니기 때문에 보이스-코드 정규화를 만족하지 못한다.
교수명은 과목명에 직접 영향을 주기 떄문에 <교수명,과목명>으로 이루어진 테이블을 따로 만들어 교수명이 후보 키 역할을 하도록 하면, 보이스-코드 정규화를 만족한다.
아래의 표를 보면 <개발자>마다 <자격증> 값들이 여러 개 존재하고, 특정 <개발자>마다 <언어> 값들이 여러개 존재한다. 이럴 경우를 다치 종속 관계라고 한다.
이를 <개발자, 자격증>, <개발자, 언어> 테이블로 분리하여 관리하여 다치 종속 관계를 제거해주는 것을 4차 정규화라고 한다.
4차 정규화 테이블에 대해 조인 연산을 수행하면 4차 정규화 수행 전 데이터와는 다르게 되는 문제인 조인 종속이 발생한다.(첫번째 이미지)
이를 방지하기 위해서는 추가적으로 <자격증,언어>관계에 대한 테이블을 만들어 줌으로써 조인했을 때 정확히 원래의 데이터로 복원할 수 있게된다. 이렇게 만드는 것을 5차 정규화라고 한다.
참고문헌 : 코딩애플 영상, 수제비 정보처리기사 실기 교재