1. DB 정규화란?

DB 정규화란 삽입/갱신/삭제 시 발생하는 이상현상이 없도록, DB를 재설계하는 것을 말합니다. DB 정규화는 다음의 목적을 가집니다. 
  • 불필요한 데이터를 제거한다. 
  • 데이터 저장을 논리적이고 직관적이게 한다. 

빠른 이해를 위해 정규화를 하지 않았을 때의 문제점이 무엇인지 간단한 예를 들도록 하겠습니다. 

학번 

주소

 수강 과목

 21101002 

서울 

C언어 

 21101002 

서울 

Java 

21101003

중국 

Java 

  1. 21101002 학생의 주소가 변경 되었을 때, 2개의 Row를 각각 수정 해주어야합니다. 2개라 크게 안 와 닿을지 모르겠지만, 100개/1000개로 늘어나면 시스템에 과부하를 가져올 것입니다. 
  2. 21101003 학생이 Java 수업을 Drop할 경우, 학적에서 21101003 학생의 정보가 아예 사라집니다. 

간단한 예이지만 위와 같은 문제점을 예방하기 위해, 앞으로 배울 4개의 정규화 과정을 배워보도록 합니다. 


2. 1NF (1 정규화)

1정규화는 각 행마다 값을 한가지만 가지도록 합니다. 예를 통해 이해해도록 하겠습니다. 




학번

 교수

 학과

과목코드

학점 

20800399

김,박,정 

 컴퓨터공학

CSE011101, CSE022202, CSE033303

A,B,C 

21300758

 상담심리MEC011101 A 
21400001

 이 

 법학

POD032939

C

21500399

 컴퓨터공학CSE011101

20800399 학생은 '수강과목' 열에 2가지 값을 가지고 있습니다. 이에 다음과 같이 1정규화 합니다. 

학번 교수

학과 

과목코드 학점
20800399

컴퓨터공학 

CSE011101

 A

20800399

컴퓨터공학 

CSE022202

 B

20800399

정 

컴퓨터공학 

CSE033303

 C

21300758

병 

상담심리 

MEC011101

 A

21400001

이 

법학 

POD032939

 C

21500399

김 

컴퓨터공학 CSE011101 B

결과적으로 정규화를 함으로써, 데이터는 더 증가하였습니다. 이는 데이터의 논리성을 강화하기 위함입니다. 하지만 보이는 바와 같이 데이터가 늘어났습니다. 1정규화로는 아직 갈 길이 멉니다. 


3. 2NF

2차 정규화는 완전 함수 종속성을 만드는 것입니다. 즉, 기본키에 속하지 않은 함수들이 모두 기본키에 종속적이어야 합니다. 


학번

학과

지도교수
20800399

컴퓨터공학

20800399 

컴퓨터공학

20800399 

 컴퓨터공학

21300758

상담심리

21400001

법학

21500399

컴퓨터공학

학번과목코드성적
20800399CSE011101

A

20800399CSE022202B
20800399CSE033303

C

21300758MEC011101A
21400001POD032939

C

21500399CSE011101

B

4. 3NF

3NF는 이행적함수종속석을 제거함으로써 성립된다. 즉 아래 도표를 보면, '학과'는 '지도교수'와 '학번' 양쪽에 종속된다. 이를 분리시키는 것을 의미한다.


 
학번

학과

20800399

컴퓨터공학

21300758

상담심리

21400001

법학

21500399

컴퓨터공학

교수

학과

컴퓨터공학

컴퓨터공학

컴퓨터공학

상담심리

이  법학

학번

과목코드성적
20800399CSE011101

A

20800399CSE022202B
20800399CSE033303

C

21300758MEC011101A
21400001POD032939

C

21500399CSE011101

B




BCNF는 다음에...



** 반복해서 읽어가며 내용 보충 예정

SQL을 사용하여 의미있는 정보를 빠르게 추출하기 위해서는, 아래와 같은 조건이 충족되어야 한다. 


1. 모든 테이블에 기본키가 있는지 확인하자

모든 테이블에는 컬럼마다 한개 이상으로 구성된 기본키가 있어야 한다. 기본키는 로우마다 유일해야하며 NULL값을 가질 수 없다. 좋은 기본키의 후보자격은 아래와 같다. 

  1. 유일한 값을 가져야 한다. (중복이 우려된다면, Auto_Increment를 이용하자)
  2. 널 값을 가질 수 없다. 
  3. 안정적이 값이어야 한다. (갱신할 필요가 없다.)
  4. 간단한 형태여야 한다. (소수점보다는 정수형)

** 기본키는 가능한 1개인 것이 빠른 SQL문을 위해 좋다. 하지만 매칭테이블과 같이 때에 따라서는 복수형 기본키가 식별하는데 더 도움이 될 때가 있다. 


2. 중복으로 저장된 데이터 항목을 제거하자

데이터를 중복으로 저장하면 일관되지 않은 데이터, 비정상적인 삽입/갱신/삭제 처리, 공간 낭비 등 많은 문제점을 일으킨다. 동일한 테이블이든 다른 테이블이든 반복되는 데이터를 최소화하는 것이 가장 중요하다. 

주제별로 테이블을 분리시커 서로 매핑(조인) 시키는 방식을 사용하면, 중복되는 데이터들을 최소화 시킬 수 있다. 
ex) Customer, Employee, Product, SalesTransactions(mapping table)로 분리

3. 반복 그룹을 제거하자

컬럼은 비싸고, 로우는 싸다! 무의미하게 반복되는 컬럼들을 지양하자. 
Ex) ID, Drawing_Number, Predecessor_1, Predecessor_2, Predecessor_3.....

4. 컬럼당 하나의 특성만 저장하자

주소: 서울특별시 서초구 반포2동 신반포아파트 15-303
주소를 Table에 저장할 때, 전체주소를 한번에 저장하면 나중에 검색할 때 "Like %"를 활용하여 검색을 해야한다. 이는 매우 효율성이 떨어지는 일이다. 

이에, '도/시' '시/군/구' '동' 등을 각각의 컬럼으로 저장한다면, 더 효율적인 쿼리문을 만들 수 있을 것이다. 이렇게 분리되어 저장된 Column들을 하나로 묶어 출력할 때는 Concat문 을 사용하면 편리하다. 

5. 왜 계산데이터를 저장하면 좋지 않은지 이해하자

테이블의 로우가 변경/삽입/삭제 될때마다 값을 재계산해야하므로 무결성을 유지하기 어렵다. 시스템에 부하를 일으키는 것보다 더 큰 혜택이 있을 경우에만 사용한다. 

6. 참조 무결성을 보호하려면 외래키를 정의하자

7. 테이블 간 관계를 명확히 하자

8. 제3정규화로도 부족하다면 더 정규화하자

9. 데이터 웨어하우스에는 역정규화를 사용하자

데이터 웨어하우스 시스템의 주 목적은 정보를 빠르게 찾는 것이다. 이에 정규화를 위반하더라도 자원을 절약할 수 있다면, column을 늘리는 것도 좋다. 
(EX: 고객 이름을 많이 검색하는 Invoice테이블이 있다면, CustomerID(외래키)뿐 아니라 이름도 포함)


Effective SQL SQL 코딩의 기술존 비아시에스,더글러스 스틸,벤 클로디어
상세보기


'RDBMS > SQL 코딩의 기술' 카테고리의 다른 글

[SQL #1] 개요  (0) 2018.07.01


이 책은 '옮긴이의 말'에도 써져있지만 입문자를 위한 책이 아니다. 어느 정도 SQL에 익숙해진 사람, DB에 대한 기본(무결성, 정규화 등)을 알고 있는 사람이 개념을 정리하고 한단계 발전할 수 있도록 쓰여진 책이다.  

Effective SQL SQL 코딩의 기술
국내도서
저자 : 존 비아시에스,더글러스 스틸,벤 클로디어 / 홍형경역
출판 : 길벗 2017.11.30
상세보기


'RDBMS > SQL 코딩의 기술' 카테고리의 다른 글

[SQL #2] 데이터 모델 설계  (0) 2018.07.01

+ Recent posts