데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법을 의미하며, 데이터를 분해하는 방법에 따라 정규화 단계가 나누어지게 된다.
정규화의 목적
데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
무결성을 지키고, 이상 현상을 방지한다.
테이블 구성을 논리적이고 직관적으로 할 수 있다.
데이터베이스 구조를 확장에 용이해진다.
[제1 정규화]
테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것
기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.
현재 테이블은 전화번호를 여러개 가지고 있어 원자값이 아니다. 따라서 1NF에 맞추기 위해서는 아래와 같이 분리할 수 있다.
[제2 정규화]
테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 한다.
조금 쉽게 말하면, 테이블에서 기본키가 복합키(키1, 키2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안된다.
기본키의 부분집합 키가 결정자가 되어선 안된다는 것
이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다. 그리고 (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있다. (학생번호, 강좌이름) --> (성적)
그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. (강좌이름) --> (강의실)
즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.
[제 3 정규화]
2NF가 진행된 테이블에서 이행적 종속을 없애기 위해 테이블을 분리하는 것이다.
이행적 종속 : A → B, B → C면 A → C가 성립된다
아래의 두가지 조건을 만족해야 한다.
릴레이션이 2NF에 만족한다.
기본키가 아닌 속성들은 기본키에 의존한다.
현재 테이블에서는 Tournament와 Year이 기본키다.
Winner는 이 두 복합키를 통해 결정된다.
하지만 Winner Date of Birth는 기본키가 아닌 Winner에 의해 결정되고 있다.
따라서 이는 3NF를 위반하고 있으므로 아래와 같이 분리해야 한다.
[참고 from 윤환님]
비공식적으로는 3NF가 되었으면 정규화되었다고 말할 수 있으며, 실제 현업에서도 제 3NF 정도까지만 수행하고 속도, 튜딩 등 필요에 따라 비정규화(Denormalization) 과정을 수행하기도 한다.
2. 인덱스가 무엇인지? + 사용하는 이유 / 적은 수의 레코드에 많은 인덱스를 사용하는 상황에서 발생할 수 있는 문제점
인덱스
추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조
테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 한다.
인덱스의 목적
RDBMS에서 검색 속도를 높이기 위함
Table의 Column을 색인화() 함
색인화 : 특정 내용이 들어있는 정보를 쉽게 찾아볼 수 있도록 표지를 넣거나 일정한 순서에 따라 배열한 것
해당 Table의 Record를 Full scan 하지 않아서 성능적인 이득
색인화 된(B+Tree 구조로) Index 파일 검색으로 검색 속도 향상
인덱스의 장단점
장점
테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
전반적인 시스템의 부하를 줄일 수 있다.
단점
인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
인덱스를 관리하기 위해 추가 작업이 필요하다.
인덱스 된 Field에서 Data를 업데이트하거나, Record를 추가 또는 삭제시 성능이 떨어짐.
데이터 변경 작업이 자주 일어나는 경우, Index를 재작성해야 하므로, 성능에 영향을 미침.
(질문 받은 곳 - IT 서비스)
[면접 질문] 정규화, 인덱스
1. 정규화에 대해 아는 것을 이야기해주세요
정규화의 목적
[제1 정규화]
현재 테이블은 전화번호를 여러개 가지고 있어 원자값이 아니다. 따라서 1NF에 맞추기 위해서는 아래와 같이 분리할 수 있다.
[제2 정규화]
이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다. 그리고 (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있다. (학생번호, 강좌이름) --> (성적) 그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. (강좌이름) --> (강의실) 즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.
[제 3 정규화]
아래의 두가지 조건을 만족해야 한다.
현재 테이블에서는 Tournament와 Year이 기본키다. Winner는 이 두 복합키를 통해 결정된다. 하지만 Winner Date of Birth는 기본키가 아닌 Winner에 의해 결정되고 있다. 따라서 이는 3NF를 위반하고 있으므로 아래와 같이 분리해야 한다.
[참고 from 윤환님]
비공식적으로는 3NF가 되었으면 정규화되었다고 말할 수 있으며, 실제 현업에서도 제 3NF 정도까지만 수행하고 속도, 튜딩 등 필요에 따라 비정규화(Denormalization) 과정을 수행하기도 한다.
2. 인덱스가 무엇인지? + 사용하는 이유 / 적은 수의 레코드에 많은 인덱스를 사용하는 상황에서 발생할 수 있는 문제점
인덱스
인덱스의 목적
RDBMS에서 검색 속도를 높이기 위함
Table의 Column을 색인화() 함
해당 Table의 Record를 Full scan 하지 않아서 성능적인 이득
색인화 된(B+Tree 구조로) Index 파일 검색으로 검색 속도 향상
인덱스의 장단점
장점
단점