오라클 10g

DB 정규화의 필요성

무니버 2010. 11. 18. 19:49

 

 

 

정규화 과정의 필요성

 

테이블은 정규화 과정을 거처서 작게 나누게 된다. 왜 그런과정을 거칠까?
이유는 메모리를 절약하기위해서이다.
(자세한 테이블 쪼개는 과정은 정규화 과정을 참조)

 

SELECT * FROM 테이블명 으로 조회하건
SELECT 컬럼명 FROM 테이블명 으로 조회하건

특정컬럼명만 SELECT 한다고 불러오기위한 데이터의 크기가 작아지지 않는다.

일단 조회를 하게되면 모조건 모든 테이블의 내용은 메모리에 올려지게되므로
테이블이 크다면 메모리리 낭비가 크다.
 
즉 우리가 모든 데이터를 하나의 테이블로 만들어버리면 데이터가 클때 많은 메모리가
필요하게 되고 메모리 낭비가 우려될수 있다. 결국 테이블은 작게 나누는과정이
일반적(이 과정을 정규화라고 한다.)

 

 

크기가큰 테이블로 인해 메모리 낭비의 예

 

 

만약 서울에 있던 관리부가 수원으로 이사를 간다면
서울에 관리부에 근무하고 있던 사원들의 정보중 부서명과 부서전화번호를 변경해주어야한다
근데 서울 관리부에 근무하고 있던 사원들의 인원수가 100만명이라면

 


일부사람들의 부서명과 전화번호를 바꾸어 준다해도 전체테이블은 일단은 메모리에
올려야한다. 만일 TABLE의 1행의 크기가 87byte 라고한다면  (87bytex100만=87MBYTE)의 메모리가 필요한데

매번 테이블을 불러낼대마다 이런다면 낭비적이다.


결국 공통된 요소를 제거하여 큰테이블을 몇개의 작은 테이블로 나누는 과정이 필요하다.

3. 간단한 정규화 과정의 예

 

일단 간단한 PRIMARY KEY 와 FOREIGN 키를 이용해 테이블을 작게 나누어보자

 

 

 

 

 

 

이런 테이블을 다음과같은 2개의 테이블로 나누어보자

SANO 사원번호, JUBUN 주민번호, SANAME 사원이름, JIK 직책, SAL 연봉, DNAME 부서, LOC=회사위치 , DTEL은 전화번호이다.

       

 

 

 

 

 

 

A. 부서테이블을 만들보자.

 DNAME , LOC 필드값은 서로 연관이있는 특정 카테고리로 묶을수 있다. 이를 각  필드가 가지는 고유한 값으로 정하면

두개의 테이블로 나눌수 있는 근거가 된다.(이것이 PK키가 된다.) 

이를 TBL_DEPT 테이블(부서테이블)이라고 해보자.

 

1)테이블을 만들고

CREATE TABLE TBL_DEPT
(DEPTNO     NUMBER(2)
,DNAME       VARCHAR2(10)
,LOC           VARCHAR2(20)
,DTEL          VARCHAR2(15)
,CONSTRAINT TBL_DEPT_DEPTNO_PK
                     PRIMARY KEY(DEPTNO)
);

=> 마지막줄이 PK 지정 명령이다.

 

2) PK 를 포함한 데이터값을 집어 넣는다.

 

INSERT INTO TBL_DEPT
VALUES(10,'관리부','서울','02-345-1234');
INSERT INTO TBL_DEPT
VALUES(20,'총무부','인천','032-545-1234');
INSERT INTO TBL_DEPT
VALUES(30,'영업부','부천','031-345-1234');
INSERT INTO TBL_DEPT
VALUES(40,'영업부','안산','031-845-1234');

 

 

주의) PK값이 동일한 값을 넣어서는 안된다. PK값이 2개를 집어넣어야한다면

PK 선택이 잘못된것이다.

 

주의2) INSERT 명령후에는 반드시

         COMMIT;

         명령을 내려야 적용된다. (단 잘 확인해보고 COMMIT;하자  ROLLBACK; 명령을 사용할수 없기때문이다.

 

 

<참고> DML문의 경우 COMMIT 명령을 따로 해주어야한다

 

 

B. 직원테이블을 만들어보자

 

 

CREATE TABLE TBL_SAWON
(SANO        NUMBER(4)
,JUBUN     CHAR(13)
,SANAME    VARCHAR2(10)
,JIK         VARCHAR2(10)
,SAL           NUMBER(4)
,DEPTNO     NUMBER(2)
,CONSTRAINT TBL_SAWON_SANO_PK PRIMARY KEY(SANO)
,CONSTRAINT TBL_SAWON_JUBUN_UQ UNIQUE(JUBUN)
,CONSTRAINT TBL_SAWON_DEPTNO_FK
                     FOREIGN KEY(DEPTNO)
                     REFERENCES TBL_DEPT(DEPTNO)
);

=> 위명령에서 DEPTNO 키가 FK 이다. 위세 부서테이블에서 PK가 가진 값만이 들어오게 되므로

    유념한다. SANO와 JUBUN 또한 사원테이블에서 유일한 키라고 할수 있으나    

    PK는 테이블당 하나뿐이기 때문에 JUBUN 은 UQ 키로 지정하였다.

 

 

 

역시 값을 넣어준다. 단 PK값(여기서는 DEPT값)을 사원테이블고 유념해서 입력해주자

 

INSERT INTO TBL_EMP
VALUES(1001,'7010091234567','홍길동','사장', 5000, '10');
INSERT INTO TBL_EMP
VALUES(1002,'7210091234567','이순신','부장', 4000, '10');
INSERT INTO TBL_EMP
VALUES(1003,'7210092234567','김옥빈','과장', 3000, '10');
INSERT INTO TBL_EMP
VALUES(1004,'7310091234567','안중근','부장', 4000, '20');
INSERT INTO TBL_EMP
VALUES(1005,'7410091234567','원빈','과장', 5000, '20');
INSERT INTO TBL_EMP
VALUES(1006,'7510092234567','하지원','대리',2000, '30');
INSERT INTO TBL_EMP
VALUES(1007,'7010091234567','이나영','사원', 2000, '30');
INSERT INTO TBL_EMP
VALUES(1008,'7710091234567','태연','이사', 9999, '40');

 

 

 

C. 다음과 같은 2개의 테이블로 나누어졌다.

 

 

 

 

 

 

<참고> 이렇게 두개로 나누어진 테이블을 연관성을 이용 한꺼번에 조회할수 있다.

 

 

 

EMP, DEPT이름의 테이블 2개가 있을떄
PRIMARY KEY가 DEPTNO 라면  

합쳐진결과를 조회 핤 있다.


SELECT E.*, D.DNAME, D.LOC
FROM EMP E JOIN  DEPT D
ON E.DEPTNO = D.DEPTNO;


 

사원정보테이블.bmp
0.23MB