/*----------------------------------------------------------------------------------------
● 제 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 했을 때보다 테이블이 차지하는 메모리 크기가 작다.
이런것들이 역정규화를 할지말지 단서를 제공해준다.
------------------------------------------------------------------------------------
'📚Study Note > ORACLE' 카테고리의 다른 글
[ ORACLE ] 무결성(Intergrity) │ PRIMARY KEY │ UNIQUE (0) | 2021.04.06 |
---|---|
[ ORACLE ] 테이블 생성 시 주의할 점 관계/속성/튜플(엔티티)/도메인/릴레이션 (0) | 2021.04.06 |
[ ORACLE ] 제 1 정규화 (0) | 2021.04.05 |
[ ORACLE ] INTERSECT 교집합쿼리에 해당하는 부분을 원본쿼리에서 찾기 서브상관쿼리 JOIN 활용... ?? (0) | 2021.04.05 |
[ ORACLE ] JOIN - UNION UNION ALL INTERSECT MINUS (0) | 2021.04.02 |