[오라클] 정규화

심심이·2024년 3월 6일

oracle

목록 보기
38/40

1. 정규화 과정

코드를 입력하세요

정규화 과정에는 제 1 정규화, 제 2 정규화, 제 3 정규화, 제 4 정규화와 역정규화 과정이 있다.

2. 정규화 종류

1) 제 1 정규화(1NF, First Normal Form)

반복되는 컬럼이 있다면 테이블을 자른다.
제 1정규화는 식별자를 꼭 줘야 한다.
식별자(pk)는 단일이거나 식별자를 묶어서 하나의 컬럼으로 줄 수 있다.

중복되어진 행이 과목테이블이다.
과목테이블이 부모테이블이 되고
성적테이블이 자식테이블이 된다.
부모테이블에 있는 pk 키는 자식테이블의 fk가 된다.

부모테이블의 식별자는 자식테이블의 외부키(Foreign Key)로 전이 되어진다.  --> 이게 제 1 정규화

2) 제 2 정규화(2NF, Second Normal Form)

모든 속성은 식별자에 직접적으로 의존적이어야 하며 이에 해당되지 않는 속성을 분리한다.

1정규화를 한 다음에 그 테이블의 pk 컬럼이 한개 컬럼이면 2정규화를 하지 않는다.

1정규화를 한 다음에 그 테이블의 pk 컬럼이 복합 pk 컬럼이면 2정규화를 한다.
=식별자가 아닌 컬럼이 식별자 일부 컬럼에 대해서 의존적이라면 그 컬럼과 함께 분리해서 새로운 테이블을 만드는 것이 2정규화

<개설과목 테이블>
과목번호와 과목명이 의존적이므로 둘을 빼서 새로운 테이블을 만든다
교수명은 교수번호에 의존적이므로 새로운 테이블을 만든다
강의실코드,설명은 분리할 수 없다.

3) 제 3 정규화(3NF, Third Normal Form)

식별자 이외의 속성은 식별자가 아닌 다른 속성에 종속적이지 않아야 한다.
1, 2 정규화를 다 한뒤 남은 테이블을 다 본다.
다 보았을 때 식별자가 아닌 일반컬럼에 의존적이라면 분리하여 새로운 테이블을 만든다.

4)제 4 정규화(4NF, Fourth Normal Form)

의존적인 다 대 다(Many to Many)관계를 제거한다.


1.테이블과 테이블 사이에 관계를 맺는다.
2. 다 대 다 관계가 형성되어진다면, 다 대 일 관계로 끊어버린다. 

3. 정규화의 흐름

성적테이블(한 과목에 대해 여러 교수가 강의하며, 한 교수는 여러 과목을 강의할 수 있다.

---------------------------------------------------------------------
과목번호  과목명  교수번호  교수명  강의실코드  강의실설명  학번  학생명  점수
---------------------------------------------------------------------

1.제 1 정규화(1NF, First Normal Form)

위의 데이터에 대해 반복되는 과목번호, 과목명, 강의실코드, 교수번호, 교수명에 대해 다른 개체로 분리한다.
분리는 개설과목과 점수라는 개체(Entity => table)로 나눌 수 있을 것이다.

  • 개설과목의 식별자 : 과목번호, 교수번호
  • 성적의 식별자 : 과목번호, 교수번호, 학번
  • 참조 키 : 과목번호, 교수번호
-> 제 1 정규화 실행 후
--------------------------------------------------------------
 과목번호(P.K)  과목명  교수번호(P.K)  교수명  강의실코드  강의실설명
--------------------------------------------------------------
--------------------------------------------------
 과목번호(P.K)  교수번호(P.K)  학번(P.K)  학생명  점수
--------------------------------------------------

==> 중복, 반복되는 데이터에 따라 다른 개체(테이블)로 분리한다.

2. 제 2 정규화(2NF, Second Normal Form)

모든 속성은 식별자에 직접적으로 의존적이어야 하며 이에 해당되지 않는 속성을 분리한다.

  1. 복합키로 구성된 식별자를 가진 경우이고
  2. 식별자의 일부분에 종속적인 속성일 때
    ==> 식별자의 일부분에 종속적인 속성을 분리한다.

과목명은 개설 과목의 식별자(과목번호, 교수번호)에서 과목번호에 부분적 종속 속성을 가지고 있으므로
개설과목, 과목으로 분리할 수 있다.

교수명 역시 개설과목의 식별자(과목번호, 교수번호)에서 교수번호에 부분적 종속 속성을 가지고 있으므로
개설과목, 과목으로 분리할 수 있다.

-> 제 2 정규화 실행 후
------------------------------
 과목번호(P.K)  과목명  배당학점
------------------------------

--------------------------
 교수번호(P.K)  교수명  주소
--------------------------

------------------------------------------------
 과목번호(P.K)  교수번호(P.K)  강의실코드  강의실설명
------------------------------------------------

==> 식별자 일부분에 종속적일때 개체를 분리한다.

학생명은 성적의 식별자(과목번호, 교수번호, 학번)에서 학번의 부분적 종속 속성을
가지고 있으므로 성적과 학생으로 나눌 수 있다.

-----------------------
 학번(P.K)  학생명  주소
-----------------------

-------------------------------------------
 과목번호(P.K)  교수번호(P.K)  학번(P.K)  점수
-------------------------------------------

3. 제 3 정규화(3NF, Third Normal Form)

식별자 이외의 속성간에 종속적인 경우에 분리해 낸다.

제 2 정규화로 생성되어진 위의 개설과목 테이블에서 “강의실설명” 컬럼은 개설과목의 식별자(과목번호, 교수번호)에서
전혀 종속적이지 않고 식별자가 아닌 “강의실코드” 컬럼에 종속되어 있으므로 개설과목과 강의실코드로 분리할 수 있다.

-> 제 3 정규화 실행 후
--------------------------------------
 과목번호(P.K)  교수번호(P.K)  강의실코드
--------------------------------------

--------------------------
 강의실코드(P.K)  강의실설명
--------------------------

4. 제 4 정규화(4NF, Fourth Normal Form)

의존적인 다 대 다(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)
---------------------------

데이터 코드화

유추할 수 없는 데이터(신청자주민번호..)는 데이터값 그대로 받도록 한다.

유추할 수 있는 데이터는 반드시 코드화 해야 한다.
학과명을 코드화 시키지 않고 그대로 받아주면
학과명에 "컴퓨터공학" , "컴퓨터공학과", "컴공과" 와 같이
들어 올 수가 있으므로 이것은 우리가 보기에는  
동일한 학과이지만 데이터베이스로 보기에는 서로 다른 학과가 되므로 
위와 같이 안 된다.!!!
그래서 학과코드 라는 코드화된 값을 입력하도록 해야한다.
profile
개발하는 심심이

0개의 댓글