본문 바로가기
2019/ORACLE

정규화 개념 / 키 / 제1~3정규화 / 비정규화

by SOLYI 2019. 11. 19.


1. 정규화

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다. 일반적으로 정규화란 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것을 포함한다. 정규화의 목적은 하나의 테이블에서의 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것이다. (출처:wikipedia)

 entity(엔티티) : emp테이블과 같은 '정보의 단위'를 가리킨다.

테이블 안에는 여러 컬럼이 있고 컬럼 = 속성attribute 
테이블 안에는 여러 속성이 있고 속성attribute = 컬럼

ERM : 개체-관계 모델링(Entity-Relationship Modelling) 
ERD : 개체-관계 다이어그램(Entity-Relationship Diagram)

2. 키

키 종류 설명
슈퍼키 어떤 테이블의 속성의 조합
후보키

슈퍼키 중에서 최소성까지 만족하는 키

유일성 + 최소성

기본키

후보키 중에서 하나를 선택한 키

 null값과 중복값 불가능

대체키 후보키 중에서 기본키로 선택되지 못한 키
외래키

다른 테이블의 기본키를 참조하는 키

null값과 중복값 허용

 

3. 제1정규형(1NF)

여러 값을 가진 컬럼이 존재할 수 없다. 즉, 반복되는 그룹이 존재하지않음. 각 행과 열에는 오직 한 값만 존재함. 사용 하고싶으면 테이블로 분리해서 사용해야 한다.

제1정규형은 다음 표준을 요구한다.   (출처:wikipedia)

  • 각 테이블에서 중복을 제거한다. 
  • 각각 관계된 데이터 모임을 위하여 분리된 테이블을 만든다.
  • 각각 관계된 데이터 모임을 기본키로 식별한다.

4. 제2정규형(2NF)

 제 1 정규형(1NF)인 테이블이 제2 정규형을 충족시키는 필요충분조건은 다음과 같다: 후보 키 K와 K에 속하지 않는 속성 A가 있을 때, A를 결정하기 위해 K의 일부가 아닌 K 전체를 참조해야만 하는 경우 1NF 테이블은 2NF이다.

모든 키가 아닌 컬럼은 기본키 전체에 의존적이어야한다. 기본키의 일부분에 의존적이어선 안된다. 같은 데이터를 2개의 테이블로 분리하여 표현하는것

출처: https://cloud0477.tistory.com/

5. 제3정규형(3NF)

제3 정규형이란 데이터베이스 정규화의 세 번째 단계로, 다음 조건을 만족해야 한다: 

  1. 테이블이 제2 정규형을 만족하고,
  2. 테이블 내의 모든 속성이 기본 키에만 의존하며, 다른 후보 키에 의존하지 않는다.[1] 

     (출처:wikipedia)

키가 아닌 컬럼은 다른 키가 아닌 컬럼에 의존적이어선 안된다(=다른 키에 의존적이면 안됨)

예를들어 아래와 같은 경우, 우승자와 우승자 생년 월일은 다른 키(대회명, 개최일시)와는 연관없이 우승자의 키에 대해서만 의존적이다.

대회 명 개최일시 우승자 우승자 생년월일
롤드컵 2017년 1월2일 최솔이 1991년 5월 15일
LCK 2018년 2월2일 김혜미 2000년 3월 3일
LPL 2019년 3월3일 김도윤 1987년 8월 8일

출처: https://cloud0477.tistory.com/

 

6. 비정규화

경우에 따라 나누어 놓은 테이블을 성능 향상의 목적으로 다시 합쳐야 할 경우 나누어 놓은 테이블들을 함께 연결해서 사용하려면 이 join 라는 방법을 사용하는데 이것을 비정규화라 한다.

다대다관계를 1대다, 다대1로 바꾸어주자는 의미.

반응형

'2019 > ORACLE' 카테고리의 다른 글

SQL 서브쿼리  (0) 2019.11.20
SQL 문제 및 문제풀이 (~JOIN)  (2) 2019.11.19
SQL JOIN equi / non-equi / self / outer / inner  (0) 2019.11.18
SQL group by (문제)  (0) 2019.11.18
SQL group by having  (0) 2019.11.18