본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] 제 1 정규화

-- ■■■ 정규화 (Nomalization) ■■■

-- ● 정규화란?
-- 한 마디로 데이터베이스 서버의 메모리 낭비를 막기 위해
-- 어떤 하나의 테이블을... 식별자를 가지는 여러 개의 테이블로
-- 나누는 과정을 말한다.


데이터가 하나의 테이블에 몰려있으면 보기는 편한데 메모리에는 보고싶은 것 외에 다른 컬럼들은 덜 따라오게만들고싶은것이다. DB메모리낭비가 심하게 된다. 메모리가 부족한 상황, 요청이 있으면 정상적인 구동어려워 셧다운해버린다. 뻗어버린다. 그래서 테이블을 여려 형태로 쪼개는건데 이걸 그냥 내가 편하게 쪼개개 된다면 쪼개진 결과물이 누가 정규화를 했는지에 따라 다르기 때문에 규칙을 만들자 이게 정규화다 

/*예를 하나 들겠습니다. 
ex) 유림이가 ... 옥장판을 판매한다. 

고객리스트 → 거래처직원 명단이 적혀있는 수첩의 정보를 데이터베이스화 하려고 한다.

테이블명 : 거래처직원

10BYTE          10BYTE      10BYTE      10BYTE          10BYTE  10BYTE  10BYTE

거래처회사명 │  회사주소  │ 회사전화 │거래처직원명 │ 직급 │이메일 │ 휴대폰
-------------------------------------------------------------------------------------

lg              여의도     02-234-5567    선혜연          부장  ..@,,   010-
lg              여의도     02-234-5567    박민지          과장  ..@,,   010-
lg              여의도     02-234-5567    김땡땡          대리  ..@,,   010-
lg              여의도     02-234-5567    안정미          부장  ..@,,   010-
sk              소공동     02-123-1234    징징이          부장  ..@,,   010-
lg              부산동래   051-999-9999   이뚱이          대리  ..@,,   010-
                                    :
                                    :
                                    :
---------------------------------------------------------------------------------

가정) 서울 여의도 LG 라는 회사에 근무하는 거래처 직원 명단이
    총 100만 명이라고 가정한다. 
    (한 행(레코드)은 각 10byte 컬럼 7개 70 byte이다.)
    
    어느 날, 『서울 여의도』에 위치한 『lg』본사가 『경기분당』으로 사옥을 이전
    이로 인해... 회사 주소는 『경기 분당』으로 바뀌고.
    회사 전화는 『031-1111-2222』 로 바뀌었다. 
    
    그러면... 100만 명의 회사주소와 회사전화를 변경해야 한다.
    - 이 때 수행되어야 할 쿼리문 → UPDATE 구문
    
    UPDATE 거래처직원
    SET 회사주소 = '경기분당', 회사전화='031-1111-2222'
    WHERE 거래처회사명='LG'
    AND 회사주소 = '서울여의도'
    
    
    --> 백 만개 행을 하드디스크에서 읽어다가 메모리에 로드시켜주어야 한다. 
    즉, 백만 * 70 Byte를 모두 
    하드디스크상에서 읽어다가 메모리에 로드시켜 주어야 한다는 말이다.
    
    -- 이는 테이블의 설계가 잘못되었으므로 DB 서버는 조만간 메모리 고갈로 인해 
    DOWN 될 것이다. 그러므로 정규화 과정을 수행해야 한다 .
    
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   
제 1 정규화 │  제 2 정규화  │  제 3 정규화  │ 제 4 정규화  │역정규화(비정규화)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    
    
●  제 1 정규화 

어떤 하나의 테이블에 반복되어 컬럼 값들이 존재한다면 값들이 반복되어 
나오는 컬럼을 분리하여 새로운 테이블을 만들어준다 .


Byte 10         10           10              10        
회사ID  │거래처회사명 │  회사주소  │ 회사전화 
-----------------------------------------------------

    01          lg        여의도     02-234-5567    
    02          sk        소공동     02-123-1234    
    03          lg        부산동래   051-999-9999   
                               
-----------------------------------------------------


Byte 10         10      10       10         10
거래처직원명 │ 직급 │이메일 │ 휴대폰│ 회사ID
-----------------------------------------------

선혜연          부장  ..@,,   010-           01
박민지          과장  ..@,,   010-           01
김땡땡          대리  ..@,,   010-           01
안정미          부장  ..@,,   010-           01
징징이          부장  ..@,,   010-           02
이뚱이          대리  ..@,,   010-           03

-----------------------------------------------
--> 제 1 정규화를 수행하는 과정에서 분리된 테이블은
-- ★ 반드시 부모 테이블과 자식 테이블의 관계를 갖게 된다. 회사-부모  직원-자식

식별을 하게 해주는 도구장치 회사ID컬럼이 식별자가 된다. PRIMARY KEY
참조되어지는것 PRIMARY KEY  참조하는컬럼 FOREIGN KEY

--> 참조 받는 컬럼이 갖는 특징(부모테이블)

▶ 반드시 고유한 값(데이터) 이 들어와야 한다.
▶ 즉, 중복된 값(데이터)이 없어야 한다. 
▶ NOT NULL 이어야 한다. 

--> 제 1 정규화를 수행하는 과정에서 부모 테이블의 PRIMARY KEY는 항상
    자식 테이블의 FOREIGN KEY로 전이된다. 
--  A※ 테이블이 분할(분리) 되기 이전 상태로 조회
SELECT A.거래처회사명, A. 회사주소,  A. 회사전화,
B.거래처직원명, B.직급 , B.이메일 휴대폰
FROM 회사 A, 직원 B
WHERE A.회사ID = B.회사ID

---> 원래의 상태로조회하는 데 이상이 없음..

가정) 서울 여의도 LG 라는 회사에 근무하는 거래처 직원 명단이
    총 100만 명이라고 가정한다. 
    (한 행(레코드)은 각 10byte 컬럼 9개 90 byte이다.)
    
    어느 날, 『서울 여의도』에 위치한 『lg』본사가 『경기분당』으로 사옥을 이전
    이로 인해... 회사 주소는 『경기 분당』으로 바뀌고.
    회사 전화는 『031-1111-2222』 로 바뀌었다. 
    
    그러면... 회사 테이블에서 1건의 회사주소와 회사전화를 변경해야 한다. 
    
    UPDATE 회사
    SET 회사주소 = '경기분당', 회사전화='031-1111-2222'
    WHERE 회사ID=10;
    
     --> 1개 행을 하드디스크에서 읽어다가 메모리에 로드시켜주어야 한다. 
    즉, 10 컬럼 4개 40 Byte를 하드디스크상에서 읽어다가 메모리에 로드시켜 주어야 한다는 말이다.   
    
    --> 이는 테이블의 설계가 잘 된 상황이다,
    --> 정규화를 수행하기 이전에는 100만 건을 처리해야 할 업무에서
    1건만 처리하면 되는 업무로 바뀐 상황이기 때문에 DB서버는 메모리
    고갈 없이 아주 빠르게 처리될 것이다.
    
    
    -- A. 거래처회사명, 회사전화
    
    SELECT 거래처회사명, 회사전화    | SELECT 거래처회사명, 회사전화
    FROM 회사                        | FROM 거래처직원
    --==>> 3*40 Byte                 | --==>> 200만 * 70 Byte
    
    
    -- B. 거래처직원명, 직급
    
    SELECT 거래처직원명, 직급        |
    FROM 직원                        |SELECT 거래처직원명, 직급 
    --==>> 200만 * 50 Byte           |FROM 거래처직원
                                     |--==>> 200만 * 70Byte
                                     
                                     
    -- C. 거래처회사명, 거래처직원명
    SELECT 회사.거래처회사명, 직원.거래처직원명     | SELECT 거래처회사명, 거래처직원명
    FROM 회사 JOIN 직원                             | FROM 거래처직원
    ON 회사.회사ID = 직원.회사ID;                   | --> 200만 * 70 Byte
                                                    |
    --===>> 3*40 Byte  +  200만 * 50 Byte           |
    




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