정규화의 필요성
1. 테이블의 삽입, 삭제, 갱신등의 과정에서 발생하는 이상현상을 방지하기 위함
2. 중복성을 최소화
3. 정보의 일관성 보장
정보의 일관성
하나의 정보가 처음부터 끝까지 같은 성질
※ DB를 정규화 시킨다는건 효율적으로 테이블을 분리하는 것이며 JOIN의 사용이
많아지는것이다.
※ 컬럼A가 완전하게 컬럼B를 결정할수 있다면 컬럼B는 컬럼A값에 함수적 종속관계
에 있다.
ex
A(과목코드) B(과목명)
A1 국어
A2 수학
A3 영어
정규화의 목적
1. 어떠한 릴레이션이라도 데이터베이스 내에서 표현할수 있도록 만듬
2. 보다 간단한 관계연산에 기초하여 검색 알고리즘을 효과적으로 만들수 있다.
3. 릴레이션에서 비정상적인 삽입, 갱신, 삭제 등의 이상이 발생하지 않기 위해
4. 새로운 형태의 데이터가 삽입될때 릴레이션을 재구성할 필요성을 줄인다.
제1정규형(1NF)
0. 반복되는 그룹 속성을 제거한뒤 기본테이블의 기본키를 추가해 새로운 테이블을
생성하고 기존의 테이블과 1 : n의 관계를 만든다.
1. 특정 컬럼의 값이 다중값을 가지는경우 제1정규형 대상이 되며 다중값을 가지는
2. 컬럼을 따로 릴레이션으로 분리하여 최대한 중복값을 없앤다.
3. 여러 값을 가진 컬럼이 존재할 수 없다. 즉 반복되는 그룹이 존재해서는 안 된다.
4. 각 행과 열에는 하나의 값만이 올수 있다.
제1정규형 예제
예제1
고객번호 고객명 취미
1 노무현 영화
1 노무현 여행
1 노무현
로 나누어 집니다.
※ 유일성을 위하여 일련번호 기본키를 추가함
예제2
학번,과정코드,평가코드,과정명,기간,시간,수강료,교재n 테이블존재
"반복되는 그룹 속성을 제거한뒤 기본테이블의 기본키를 추가해 새로운 테이블을
생성하고 기존의 테이블과 1 : n의 관계를 만든다."
조건
1. 하나의 학번은 여러개의 과정을 들을수 있다.
2. 과정명,기간,시간,수강료,교재n 는 과정코드에 종속적이다.
3. 하나의 과정에 교재는 여러개이다.
반복되는 교재속성을 따로분리를 시켜서
"학번(PK), 과정코드(PK), 평가코드, 기간, 시간, 수강료"의 수강정보테이블을 하나 만들수
있습니다.
"과정코드(PK),교재번호(PK),교재" 이렇게 교재정보테이블을 만들수 있습니다.
제2정규형(2NF)
어떤 릴레이션이 제1정규형이고 키가 아닌 컬럼은 기본 키 전체에 의존적이여야 한다.
예제1
이것은 2정규화를 거치면
사번(p.k) 프로젝트번호(p.k) 프로젝트역할 고과율
사번 부서
예제2
"복합키에 전체적으로 의존하지 않는 속성들을 제거한다."
1정규화에서 나온 수강정보테이블을 보자면 "학번,과정코드,평가코드,기간,시간,수강료"가
있습니다.
여기에서 위에서 말한 "하나의 학번은 여러개의 과정을 들을수 있다." 를 보면 key는 학번과
과정코드가 됩니다.
여기에서 과정코드에 의존적인 컬럼을 살펴보자면 기간,시간,수강료가 될수 있습니다.
2정규화에 의해서 분리한다면 학번,과정코드,평가코드의 수강정보테이블이 하나 나옵니다.
그리고 과정코드,기간,시간,수강료의 과정정보테이블이 하나 나옵니다.
그리고 1정규화에 나온 교재정보테이블이 있죠
제3정규형(3NF)
오떤 릴레이션이 제2정규형이고 키가아닌 컬럼은, 다른 키가 아닌 컬럼에 의존적이어서는 안
된다.
제3정규형 예제
제2정규형와 제3정규형의 관계
2NF ->(프로젝션) 3NF
2NF <-(조인) 3NF
제4정규화(4NF)
2정규화 된 테이블은 다대다 관계를 가질수 없다.
제5정규화(4NF)
실무에서 많이 사용하지 않는다. 이론에서만 다룬다.
역정규화(중복 데이타가 최대한 생길수 있는 설계)
- 역정규화 테이블 구조에서는 한테이블에서 데이타를 조회한다.
- 역정규화로 테이블이 구성되면 JOIN 연산자를 많이 사용하지 않게 된다.
사용자명으로 검색방법
SELECT * FROM BOARD WHERE NAME LIKE '이준식%';
정규화(종복 데이타를 최대한 없애는 설계)
- 정규화 테이블 구조에서는 여러테이블에서 서브쿼리, 조인으로 데이타를 조회한다.
- 정규화로 테이블이 구성되면 JOIN 연산자를 많이 사용하게 된다.
사용자명으로 검색방법
SELECT * FROM BOARD WHERE ID IN( SELECT ID FROM MEMBER WHERE NAME LIKE '이준
식%' );
SELECT * FROM BOARD A INNER JOIN MEMBER B ON A.ID = B.ID WHERE B.NAME LIKE '이
준식%';
SELECT * FROM BOARD A INNER JOIN MEMBER B ON A.ID = B.ID AND B.NAME LIKE '이준
식%';
출처 : www.phpschool.com
성적 관리 원장
학번 이름 선택과목 담당교수
0001 이준 자료구조 노일순1
0002 이영
0003 이민 전산영어 노일순2
위의 테이블 설계의 문제점은 학번이 0002 인 레코드의 선택과목, 담당교수의 값이 널값이라
는것이다. 레코드가 많아지면 공간의 낭비가 크게 발생하게 된다. 위의 테이블을 아래와 같이
정규화(중복제거,빈값제외)한다.
학생 원장
학번 이름
0001 이준
0002 이영
0003 이민
선택과목원장
학번 선택과목 담당교수
0001 자료구조 노일순1
0003 전산영어 노일순2
위와 같이 정규화(중복제거,빈값제외) 과정을 통하면 공간에 대한 낭비가 없어진다.
위에서 학생원장은 부모테이블이며 선택과목원장은 자식테이블이다.
학생원장의 학번은 PK 이며 선택과목원장의 학번은 FK 이다.
선택과목원장의 학번값에는 학생원장의 학번값에 꼭 포함되어야 하며 널값도 포함될수 없
다.
만약 이를 어겼을경우에는 참조무결성에 위배된다고 말하며 잘못된 구조를 가진것이다.
[출처] [데이터베이스] 정규화에 관한 간단한 정리|작성자 엉클퐝
규화의 필요성
1. 테이블의 삽입, 삭제, 갱신등의 과정에서 발생하는 이상현상을 방지하기 위함
2. 중복성을 최소화
3. 정보의 일관성 보장
정보의 일관성
하나의 정보가 처음부터 끝까지 같은 성질
※ DB를 정규화 시킨다는건 효율적으로 테이블을 분리하는 것이며 JOIN의 사용이
많아지는것이다.
※ 컬럼A가 완전하게 컬럼B를 결정할수 있다면 컬럼B는 컬럼A값에 함수적 종속관계
에 있다.
ex
A(과목코드) B(과목명)
A1 국어
A2 수학
A3 영어
정규화의 목적
1. 어떠한 릴레이션이라도 데이터베이스 내에서 표현할수 있도록 만듬
2. 보다 간단한 관계연산에 기초하여 검색 알고리즘을 효과적으로 만들수 있다.
3. 릴레이션에서 비정상적인 삽입, 갱신, 삭제 등의 이상이 발생하지 않기 위해
4. 새로운 형태의 데이터가 삽입될때 릴레이션을 재구성할 필요성을 줄인다.
제1정규형(1NF)
0. 반복되는 그룹 속성을 제거한뒤 기본테이블의 기본키를 추가해 새로운 테이블을
생성하고 기존의 테이블과 1 : n의 관계를 만든다.
1. 특정 컬럼의 값이 다중값을 가지는경우 제1정규형 대상이 되며 다중값을 가지는
2. 컬럼을 따로 릴레이션으로 분리하여 최대한 중복값을 없앤다.
3. 여러 값을 가진 컬럼이 존재할 수 없다. 즉 반복되는 그룹이 존재해서는 안 된다.
4. 각 행과 열에는 하나의 값만이 올수 있다.
제1정규형 예제
예제1
고객번호 고객명 취미
1 노무현 영화
1 노무현 여행
1 노무현
로 나누어 집니다.
※ 유일성을 위하여 일련번호 기본키를 추가함
예제2
학번,과정코드,평가코드,과정명,기간,시간,수강료,교재n 테이블존재
"반복되는 그룹 속성을 제거한뒤 기본테이블의 기본키를 추가해 새로운 테이블을
생성하고 기존의 테이블과 1 : n의 관계를 만든다."
조건
1. 하나의 학번은 여러개의 과정을 들을수 있다.
2. 과정명,기간,시간,수강료,교재n 는 과정코드에 종속적이다.
3. 하나의 과정에 교재는 여러개이다.
반복되는 교재속성을 따로분리를 시켜서
"학번(PK), 과정코드(PK), 평가코드, 기간, 시간, 수강료"의 수강정보테이블을 하나 만들수
있습니다.
"과정코드(PK),교재번호(PK),교재" 이렇게 교재정보테이블을 만들수 있습니다.
제2정규형(2NF)
어떤 릴레이션이 제1정규형이고 키가 아닌 컬럼은 기본 키 전체에 의존적이여야 한다.
예제1
이것은 2정규화를 거치면
사번(p.k) 프로젝트번호(p.k) 프로젝트역할 고과율
사번 부서
예제2
"복합키에 전체적으로 의존하지 않는 속성들을 제거한다."
1정규화에서 나온 수강정보테이블을 보자면 "학번,과정코드,평가코드,기간,시간,수강료"가
있습니다.
여기에서 위에서 말한 "하나의 학번은 여러개의 과정을 들을수 있다." 를 보면 key는 학번과
과정코드가 됩니다.
여기에서 과정코드에 의존적인 컬럼을 살펴보자면 기간,시간,수강료가 될수 있습니다.
2정규화에 의해서 분리한다면 학번,과정코드,평가코드의 수강정보테이블이 하나 나옵니다.
그리고 과정코드,기간,시간,수강료의 과정정보테이블이 하나 나옵니다.
그리고 1정규화에 나온 교재정보테이블이 있죠
제3정규형(3NF)
오떤 릴레이션이 제2정규형이고 키가아닌 컬럼은, 다른 키가 아닌 컬럼에 의존적이어서는 안
된다.
제3정규형 예제
제2정규형와 제3정규형의 관계
2NF ->(프로젝션) 3NF
2NF <-(조인) 3NF
제4정규화(4NF)
2정규화 된 테이블은 다대다 관계를 가질수 없다.
제5정규화(4NF)
실무에서 많이 사용하지 않는다. 이론에서만 다룬다.
역정규화(중복 데이타가 최대한 생길수 있는 설계)
- 역정규화 테이블 구조에서는 한테이블에서 데이타를 조회한다.
- 역정규화로 테이블이 구성되면 JOIN 연산자를 많이 사용하지 않게 된다.
사용자명으로 검색방법
SELECT * FROM BOARD WHERE NAME LIKE '이준식%';
정규화(종복 데이타를 최대한 없애는 설계)
- 정규화 테이블 구조에서는 여러테이블에서 서브쿼리, 조인으로 데이타를 조회한다.
- 정규화로 테이블이 구성되면 JOIN 연산자를 많이 사용하게 된다.
사용자명으로 검색방법
SELECT * FROM BOARD WHERE ID IN( SELECT ID FROM MEMBER WHERE NAME LIKE '이준
식%' );
SELECT * FROM BOARD A INNER JOIN MEMBER B ON A.ID = B.ID WHERE B.NAME LIKE '이
준식%';
SELECT * FROM BOARD A INNER JOIN MEMBER B ON A.ID = B.ID AND B.NAME LIKE '이준
식%';
출처 : www.phpschool.com
성적 관리 원장
학번 이름 선택과목 담당교수
0001 이준 자료구조 노일순1
0002 이영
0003 이민 전산영어 노일순2
위의 테이블 설계의 문제점은 학번이 0002 인 레코드의 선택과목, 담당교수의 값이 널값이라
는것이다. 레코드가 많아지면 공간의 낭비가 크게 발생하게 된다. 위의 테이블을 아래와 같이
정규화(중복제거,빈값제외)한다.
학생 원장
학번 이름
0001 이준
0002 이영
0003 이민
선택과목원장
학번 선택과목 담당교수
0001 자료구조 노일순1
0003 전산영어 노일순2
위와 같이 정규화(중복제거,빈값제외) 과정을 통하면 공간에 대한 낭비가 없어진다.
위에서 학생원장은 부모테이블이며 선택과목원장은 자식테이블이다.
학생원장의 학번은 PK 이며 선택과목원장의 학번은 FK 이다.
선택과목원장의 학번값에는 학생원장의 학번값에 꼭 포함되어야 하며 널값도 포함될수 없
다.
만약 이를 어겼을경우에는 참조무결성에 위배된다고 말하며 잘못된 구조를 가진것이다.
출처] [Oracle] 데이터 모델링|작성자 Premium
'DataBase' 카테고리의 다른 글
mysql 에서 function, procedure 확인 및 수정 (0) | 2013.12.19 |
---|---|
MySql DB 덤프 (0) | 2013.12.19 |
[Oracle] 데이터 모델링 (0) | 2012.11.06 |
TRUNCATE TABLE (0) | 2012.11.06 |
조인 순서 조정을 위한 힌트(ordered, leading) (0) | 2012.08.21 |