본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] 제 2 정규화 제 3 정규화 제 4 정규화 역정규화

/*----------------------------------------------------------------------------------------    
● 제  2 정규화



- 테이블명 : 주문
-------------------------------------------------------------------
    고객ID        제품코드            주문일자            주문수량
    +++++++++++++++++++++++++++++++++++++++++
                (P.K)
-------------------------------------------------------------------
    PNH1227(박)    SMK123(새우깡)   2021-02-04 11:11:11        50 
    HHR7733(한)    YPR123(양파링)   2021-02-04 13:40:50        30
    LHJ3361(이)    CPI110(촠파이)   2021-02-05 10:22:30        20
    LHJ3361(이)    SMK123(새우깡)   2021-02-06 17:00:20        20
    LSH7654(정)    CPI110(촠파이)   2021-02-07 05:00:13        50
                        :
                        :
                        :
-------------------------------------------------------------------


 ※ 하나의 테이블에 존재하는 PRIMARY KEY의 최대 갯수는 1개이다.
 하지만 , PRIMARY KEY 를 이루는(구성하는) 컬럼의 갯수는
 복수(다수, 여러개)인 것이 가능하다.
 컬럼 1개로만(단일 컬럼) 구성된 PRIMARY KEY를 
 Single Primary key 라고 부른다.
 (단일 프라이머리 키)
 두 개 이상의 컬럼으로 구성된 primary key를
 Composition Primary Key 라고 부른다.
 (복합 프라이머리 키)
 
 
 제 2 정규화는...
 
 제 1 정규화를 마친 결과물에서 primary key 가 single column 이라면
 제 2 정규화는 수행하지 않는다.
 하지만 primary key 가 composition column 이라면
 반★드★시 제 2 정규화를 수행해야 한다. 
 
 식별자가 아닌 컬럼은 식별자 전체 컬럼에 대해 의존적이어야 하는데
 식별자 전체컬럼이 아닌 일부 식별자 컬럼에 대해서만 의존적이라면
 이를 분리하여 새로운 테이블을 생성해준다. 
 
 테이블명 : 과목
 -------------------------------------------------------------------------
 과목번호   과목명     교수자번호   교수자명    강의실코드   강의실설명
 *******               *********
   (     PRIMARY KEY     )
 -------------------------------------------------------------------------
JAVA101     자바기초    21          장영실         A403      전산실습관 3층 30석 규모
JAVA102     자바중급    22          테슬라         T502      전자공학관 5층 20석 규모
DB102       오라클중급  22          테슬라         A201      전산실습관 2층 50석 규모
DB102       오라클중급  21          장영실         T502      전자공학관 5층 20석 규모
DB103       오라클고급  23          에디슨         A203      전산실습관 2층 30석 규모
JSP105      JSP심화     21          장영실         K101      인문사회관 1층 80석 규모
                                        :
                                        :
                                        :
    
-----------------------------------------------------------------------------


테이블명 : 점수

-----------------------------------------------------
과목번호    교수자번호   학번  학생명     점수
********   **********
DB102       21          2102110 장서현     80
DB102       21          2102127 안정미     76
                     :
                     :
                     :
------------------------------------------------------

나누고 분리한다 데이터서버 메모리 낭비 막기 위해서 하나의 테이블을 식별자를 갖는 테이블로 나누는 것 
부모테이블과 자식테이블의 관계로 나타난다 참조받는 컬럼은 자식테이블의 참조하는 컬럼이 된다
부모 테이블의 참조받는 컬럼의 특징 1. 고유값 갖는다(= 중복값 없어야) 2. NOT NULL
이게 끝나고 2정규화 해야 한다. 그 전에 PRIMARY KEY에 대해 논의하고 넘어왔다.
한 테이블에 한 개까지 올 수 있다. 프라이머리키가 여러 개가 될 수 있다. 하나를 구성하는 컬럼은
복수 컬럼이 가능하다. 컬럼이 하나이면 단일 프라이머리 키 컬럼이 두 개 이상 여러 개 일 경우 복합
프라이머리 키라고 부른다. 1정규화 결과가 단일 프라이머리키면 필요없지만 복합이라면 2정규화해야한다.
식별자 전체 컬럼이 의존적이어야 하는데 
일부 식별자에게만 의존적이라면 ....
예를 들어 과목명은 과목번호에만 의존적이다. 교수자명은 교수자번호에만 의존적이다. 
이 둘을 분리해서 새로운 테이블을 만들어주어야 한다. 이것이 제 2 정규화

----------------------------------------------------------------------------*/

모든 비식별자가 모든 식별자에게 의존적이어야 하는데 그러지 않는 경우가 많으므로 2정규화를 하게 된다.

 

----------------------------------------------------------------------------
● 제 3 정규화

식별자가 아닌 컬럼이 식별자가 아닌 컬럼에 의존적인 상황이라면
이를 분리하여 새로운 테이블을 생성해주어야 한다.

팀장1 팀장2 팀원 1 팀원 2  팀원3

팀원1이 팀원3에게 의존적인 상황
---------------------------------------------------------------------------

 

 

 

---------------------------------------------------------------------------
● 제 4 정규화

※ 관계(Relation) 의 종류
-- 1 : 1 데이터베이
-- 1 : 다(many) 관계형 데이터베이스에서 가장 바람직한 형태의 관계
-- 제 1 정규화를 마친 결과물에서 대표적으로 나타나는 바람직한 관계.
-- 관계형 데이터베이스를 활용하는 과정에서 추구해야 하는 관계.

-- 다 : 다
논리적인 모델링에서 존재할 수 있지만 (머리로 생각해보면 존재할 수 있지만 해볼려고 하면 안됨)
실제 물리적인 모델링에서는 존재할 수 없는 관계

테이블명 : 고객                       테이블명 : 제품
----------------------------------    ----------------------------------------
고객번호    고객명     이메일          제품코드   제품명     제품단가
++++++++                              ++++++++
----------------------------------    ----------------------------------------

1100        소서현     ssh@...          SWK123     새우깡         1500
1101        조은선     ces@...          GGK        감자깡         800
1102        심혜진     shj@...          GGC        자갈치         700


서현이가 새우깡, 감자깡, 자갈치 다 사 먹을 수 있다
그런데 이것은 고객(다) : 제품(다)  즉, 다대다의 관계라서
불가능한 구조이다 이것을 가능하게 하려면

테이블이 하나 더 있어야 한다,

테이블명 : 주문등록(접수)
-------------------------------------------------
고객번호    제품코드    주문일자    주문수량
++++++++    +++++++++
=================================================
1100        SWK123      2021~~      30
1101        SWK123      2021~~      20
1102        SWK123      2021~~      30
1102        GGC345      2021~~      30
1100        SWK123      2021~~      10

    
  제 4 정규화 : 
  위에서 확인한 내용과 같이 다대다 관계를 1대다 관계로 깨뜨리는 과정이
  제 4 정규화의 수행 과정이다.   일반적으로 파생 테이블 생성
  다대다 관계를 1대다 관계로 깨뜨리는 역할 수행  
  
  1대일 할수있지만 대부분 피해야한다
  1대다가 가장 이상적이다, 일대다 학생과 과목 사이에 수강신청 이제 제4정규화이다.    
    
------------------------------------------------------------------------

 

------------------------------------------------------------------------
 ● 역정규화 (비정규화)
 
 테이블명 : 부서                테이블명:사원
 ===========================   ============================================
 부서번호   부서명     주소      사원번호    사원명 직급  급여  입사일 부서번호
 +++++++                        ++++++                                        =======FOREIGN
 ---------------------------   ----------------------------------------------  
 10개행                                       1,000,000 개 행
 --------------------------    ---------------------------------------------

>> 업무 분석 상 조회 결과물
--------------------------
부서명 사원명 직급  급여
--------------------------
이렇ㄱ ㅔ많이 쓰니까 사원 테이블에 '부서명' 컬럼을 하나 더 추가하자! 가 되는 것

→ 『부서』테이블과 『사원』테이블을 JOIN 했을 때의 크기
(10*30  Byte) + (1000000 * 60 Byte) = 300 + 60000000(6천만) = 60,000,300

    
『사원』테이블을 역정규화 수행한 후 이 테이블만 읽어올 때의 크기
(즉, 부서테이블의 부서명 컬럼을 사원 테이블에 추가한 경우)
(1000000 * 70Byte) = 70,000,000

역정규화를 했을 때가 JOIN 했을 때보다 테이블이 차지하는 메모리 크기가 크다


 테이블명 : 부서                                     테이블명:사원
 ====================                 ===============================
 부서번호   부서명     주소                        사원번호    사원명 직급  급여  입사일 부서번호
 +++++++                                            +++++++++++                             =======FOREIGN
 ---------------------------                             ----------------------------------------------  
    500,000개행                                       1,000,000 개 행
 --------------------------                              ---------------------------------------------

>> 업무 분석 상 조회 결과물
--------------------------
부서명 사원명 직급  급여
--------------------------
이렇게 많이 쓰니까 사원 테이블에 '부서명' 컬럼을 하나 더 추가하자! 가 되는 것

→ 『부서』테이블과 『사원』테이블을 JOIN 했을 때의 크기
(500000*30  Byte) + (1000000 * 60 Byte) = 15,000,000 + 60,000,000 = 75,000,000(칠천오백만)

    
『사원』테이블을 역정규화 수행한 후 이 테이블만 읽어올 때의 크기
(즉, 부서테이블의 부서명 컬럼을 사원 테이블에 추가한 경우)
(1000000 * 70Byte) = 70,000,000
역정규화를 했을 때가 JOIN 했을 때보다 테이블이 차지하는 메모리 크기가 작다.

이런것들이 역정규화를 할지말지 단서를 제공해준다.

------------------------------------------------------------------------------------