코드를 입력하세요
정규화 과정에는 제 1 정규화, 제 2 정규화, 제 3 정규화, 제 4 정규화와 역정규화 과정이 있다.
반복되는 컬럼이 있다면 테이블을 자른다.
제 1정규화는 식별자를 꼭 줘야 한다.
식별자(pk)는 단일이거나 식별자를 묶어서 하나의 컬럼으로 줄 수 있다.
중복되어진 행이 과목테이블이다.
과목테이블이 부모테이블이 되고
성적테이블이 자식테이블이 된다.
부모테이블에 있는 pk 키는 자식테이블의 fk가 된다.
부모테이블의 식별자는 자식테이블의 외부키(Foreign Key)로 전이 되어진다. --> 이게 제 1 정규화
모든 속성은 식별자에 직접적으로 의존적이어야 하며 이에 해당되지 않는 속성을 분리한다.
1정규화를 한 다음에 그 테이블의 pk 컬럼이 한개 컬럼이면 2정규화를 하지 않는다.
1정규화를 한 다음에 그 테이블의 pk 컬럼이 복합 pk 컬럼이면 2정규화를 한다.
=식별자가 아닌 컬럼이 식별자 일부 컬럼에 대해서 의존적이라면 그 컬럼과 함께 분리해서 새로운 테이블을 만드는 것이 2정규화
<개설과목 테이블>
과목번호와 과목명이 의존적이므로 둘을 빼서 새로운 테이블을 만든다
교수명은 교수번호에 의존적이므로 새로운 테이블을 만든다
강의실코드,설명은 분리할 수 없다.
식별자 이외의 속성은 식별자가 아닌 다른 속성에 종속적이지 않아야 한다.
1, 2 정규화를 다 한뒤 남은 테이블을 다 본다.
다 보았을 때 식별자가 아닌 일반컬럼에 의존적이라면 분리하여 새로운 테이블을 만든다.
의존적인 다 대 다(Many to Many)관계를 제거한다.
1.테이블과 테이블 사이에 관계를 맺는다.
2. 다 대 다 관계가 형성되어진다면, 다 대 일 관계로 끊어버린다.
성적테이블(한 과목에 대해 여러 교수가 강의하며, 한 교수는 여러 과목을 강의할 수 있다.
---------------------------------------------------------------------
과목번호 과목명 교수번호 교수명 강의실코드 강의실설명 학번 학생명 점수
---------------------------------------------------------------------
위의 데이터에 대해 반복되는 과목번호, 과목명, 강의실코드, 교수번호, 교수명에 대해 다른 개체로 분리한다.
분리는 개설과목과 점수라는 개체(Entity => table)로 나눌 수 있을 것이다.
-> 제 1 정규화 실행 후
--------------------------------------------------------------
과목번호(P.K) 과목명 교수번호(P.K) 교수명 강의실코드 강의실설명
--------------------------------------------------------------
--------------------------------------------------
과목번호(P.K) 교수번호(P.K) 학번(P.K) 학생명 점수
--------------------------------------------------
==> 중복, 반복되는 데이터에 따라 다른 개체(테이블)로 분리한다.
모든 속성은 식별자에 직접적으로 의존적이어야 하며 이에 해당되지 않는 속성을 분리한다.
과목명은 개설 과목의 식별자(과목번호, 교수번호)에서 과목번호에 부분적 종속 속성을 가지고 있으므로
개설과목, 과목으로 분리할 수 있다.
교수명 역시 개설과목의 식별자(과목번호, 교수번호)에서 교수번호에 부분적 종속 속성을 가지고 있으므로
개설과목, 과목으로 분리할 수 있다.
-> 제 2 정규화 실행 후
------------------------------
과목번호(P.K) 과목명 배당학점
------------------------------
--------------------------
교수번호(P.K) 교수명 주소
--------------------------
------------------------------------------------
과목번호(P.K) 교수번호(P.K) 강의실코드 강의실설명
------------------------------------------------
==> 식별자 일부분에 종속적일때 개체를 분리한다.
학생명은 성적의 식별자(과목번호, 교수번호, 학번)에서 학번의 부분적 종속 속성을
가지고 있으므로 성적과 학생으로 나눌 수 있다.
-----------------------
학번(P.K) 학생명 주소
-----------------------
-------------------------------------------
과목번호(P.K) 교수번호(P.K) 학번(P.K) 점수
-------------------------------------------
식별자 이외의 속성간에 종속적인 경우에 분리해 낸다.
제 2 정규화로 생성되어진 위의 개설과목 테이블에서 “강의실설명” 컬럼은 개설과목의 식별자(과목번호, 교수번호)에서
전혀 종속적이지 않고 식별자가 아닌 “강의실코드” 컬럼에 종속되어 있으므로 개설과목과 강의실코드로 분리할 수 있다.
-> 제 3 정규화 실행 후
--------------------------------------
과목번호(P.K) 교수번호(P.K) 강의실코드
--------------------------------------
--------------------------
강의실코드(P.K) 강의실설명
--------------------------
의존적인 다 대 다(Many to Many)관계를 제거하는 것이 제 4 정규화 이다.
아래의 그림과 같이 ‘과목’ 테이블과 ‘교수’ 테이블이 있다고 가정하자.
이 두 개의 테이블은 다 대 다 관계가 형성 되어진다.
즉, 특정 1 과목에 대해 1명 이상의 교수들이 강의를 할 수 있고,
1 명의 교수가 1 과목 이상의 과목을 강의할 수 있기 때문이다.
이러한 의존적인 다 대 다(Many to Many)관계를 해소하면 개설과목이라는 새로운 실체(Entity)가 생성 되어진다.
이때 생성되어지는 새로운 실체(Entity)의 Primary Key 는
부모 테이블(여기서는 과목, 교수)의 Primary Key 가 전이되어 복합 Primary Key 로 생성되어진다.
-> 제 4 정규화 실행 후
---------------------
과목번호(P.K) 과목명
---------------------
---------------------
교수번호(P.K) 교수명
---------------------
---------------------------
과목번호(P.K) 교수번호(P.K)
---------------------------
유추할 수 없는 데이터(신청자주민번호..)는 데이터값 그대로 받도록 한다.
유추할 수 있는 데이터는 반드시 코드화 해야 한다.
학과명을 코드화 시키지 않고 그대로 받아주면
학과명에 "컴퓨터공학" , "컴퓨터공학과", "컴공과" 와 같이
들어 올 수가 있으므로 이것은 우리가 보기에는
동일한 학과이지만 데이터베이스로 보기에는 서로 다른 학과가 되므로
위와 같이 안 된다.!!!
그래서 학과코드 라는 코드화된 값을 입력하도록 해야한다.