정규화 과정의 필요성
테이블은 정규화 과정을 거처서 작게 나누게 된다. 왜 그런과정을 거칠까?
이유는 메모리를 절약하기위해서이다.
(자세한 테이블 쪼개는 과정은 정규화 과정을 참조)
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;
'오라클 10g' 카테고리의 다른 글
오라클의 데이터 타입 (0) | 2010.11.18 |
---|---|
SELECT 문 처리 순서 (0) | 2010.11.18 |
오라클 권한에 대한 내용들 (0) | 2010.11.17 |
오라클 SYS 암호 잊어버렸을대 해결법. (0) | 2010.11.17 |
오라클에서 패스워드가 틀려도 원격접속되버리는 문제 (0) | 2010.11.17 |