키는 데이터베이스에서 조건에 만족하는 튜플을 찾거나, 순서대로 정렬할 때 튜플을 서로 구분하는 기준이 되는 애트리뷰트이다.
슈퍼키(Super Key)
후보키(Candidate Key)
기본키(Primary Key)
대체키(Alternate Key)
외래키(Foreign Key)
정규화는 관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상을 방지하고, 데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정이다. 정규화를 하면서 데이터를 논리적으로 구성할 수 있다.
이상 현상(Anomaly)
NAME | AGE | EMAIL_ADDRESS |
---|---|---|
오재섭 | 25 | app@apple.com, ddd@google.com |
권이수 | 24 | fff@naver.com |
오재섭의 메일주소에 2개의 값이 들어가 있기에 1차 정규형을 만족하지 않는다.
NAME | AGE | EMAIL_ADDRESS |
---|---|---|
오재섭 | 25 | app@apple.com |
오재섭 | 25 | ddd@google.com |
권이수 | 24 | fff@naver.com |
위처럼 테이블을 분해하여 컬럼이 원자값을 가지면 1차 정규형이 된다.
NAME | AGE | FAVORITE_FOOD |
---|---|---|
오재섭 | 25 | 떡볶이 |
오재섭 | 25 | 삼계탕 |
풍혜림 | 25 | 고기국수 |
정현 | 24 | 수제비 |
권이수 | 24 | 파스타 |
위 테이블의 기본키는 (이름, 좋아하는 음식)으로 복합키이다. 두 개의 컬럼이 합쳐져야 한 로우를 구분할 수 있다.
나이의 경우엔 해당 기본키 중 이름에만 종속되어 있다. 이름 컬럼의 값에서 나이의 값이 도출되는 것이다. 여기서 나이가 중복되어 여러 번 들어가는 것은 불필요하다.
NAME | FAVORITE_FOOD |
---|---|
오재섭 | 떡볶이 |
오재섭 | 삼계탕 |
풍혜림 | 고기국수 |
정현 | 수제비 |
권이수 | 파스타 |
NAME | AGE |
---|---|
오재섭 | 25 |
오재섭 | 25 |
풍혜림 | 25 |
정현 | 24 |
권이수 | 24 |
위와 같이 테이블을 분해하여 2차 정규형을 만족시킬 수 있다.
STUDENT_ID | STUDENT_NAME | STREET | CITY | STATE | ZIP |
---|
기본키 STUDENT_ID가 있다.
ZIP이 결정되면 STREET, CITY, STATE가 결정된다.
여러 명의 학생이 같은 ZIP을 가질 때, 그에 따라 동일한 STREET, CITY, STATE가 결정되기에 컬럼 사이 중복된 데이터가 생길 수 있다.
STUDENT_ID | STUDENT_NAME | ZIP |
---|
ZIP | STREET | CITY | STATE |
---|
이는 2차 정규화처럼 테이블을 분해하여 해결할 수 있다.
이행적 함수 종속을 제거한다는 것은 기본키 이외 다른 컬럼이 또다른 컬럼을 결정하지 못하도록 데이터 구조를 변경한다는 것이다.
STUDENT | SUBJECT | PROFESSOR | GRADES |
---|---|---|---|
1 | 데이터베이스 | 임버들 | A |
2 | C 프로그래밍 | 서마음 | A |
3 | C 프로그래밍 | 서마음 | A |
슈퍼키 중 최소성을 만족하는 후보키는 (STUDENT, SUBJECT)이다. 교수가 한 과목만 강의할 수 있다고 가정할 때 위 테이블에선 교수가 결정자이다. 교수에 따라 과목이 정해진다.
그러나 교수는 후보키가 아니다. 이 경우 BCNF를 만족하지 않는다고 한다.
일반 컬럼이 후보키를 결정할 때 3차 정규형을 만족하면서 BCNF를 만족하지 않을 수 있다.
위처럼 테이블이 구성되었다면 데이터가 중복되며, 갱신 이상이 발생한다. 이를테면 서마음이 강의하는 과목명이 바뀐다면 두 개의 로우를 갱신해야 한다. 이를 해결하기 위해 테이블을 분리해야 한다.
교수 테이블
PROFESSOR | SUBJECT |
---|---|
임버들 | 데이터베이스 |
서마음 | C 프로그래밍 |
서마음 | C 프로그래밍 |
수강 테이블
STUDENT | SUBJECT | GRADES |
---|---|---|
1 | 데이터베이스 | A |
2 | C 프로그래밍 | A |
3 | C 프로그래밍 | A |
DEVELOPER | CERTIFICATE | LANGUAGE |
---|---|---|
임버들 | 정보처리기사 | C |
임버들 | 정보처리기사 | C++ |
임버들 | 빅데이터분석기사 | C |
임버들 | 빅데이터분석기사 | C++ |
성이경 | 정보보안기사 | JAVA |
다치 종속 관계는 원자값을 만드는 1차 정규화 과정에서 발생한다.
위 예시에선 개발자마다 자격증이 여러 개 존재하고, 특정 개발자마다 언어가 여러 개 존재한다. 그러나 자격증과 언어는 의미적으로 아무 관계가 없다.
테이블의 속성 A, B, C가 있을 때 (A, B) 값에 종속되는 C란 속성이 A에만 종속이고 B엔 독립적인 경우를 다치 종속 관계라 한다.
개발자에 새로운 언어를 추가할 때 자격증에 대한 중복 데이터가 생성된다. 임버들에 새로운 언어를 추가하기 위해선 튜플을 2개 삽입해야 하는 삽입 이상이 일어나는 것이다.
DEVELOPER | CERTIFICATE |
---|---|
임버들 | 정보처리기사 |
임버들 | 빅데이터분석기사 |
성이경 | 정보보안기사 |
DEVELOPER | LANGUAGE |
---|---|
임버들 | C |
임버들 | C++ |
성이경 | JAVA |
개발자별로 여러 자격증값과 여러 언어값이 있기에 (개발자, 자격증), (개발자, 언어) 테이블로 분리하면 다치 종속 관계를 제거하여 4차 정규형을 만족한다.
DEVELOPER | CERTIFICATE | LANGUAGE |
---|---|---|
임버들 | 정보처리기사 | C |
임버들 | 빅데이터분석기사 | C++ |
성이경 | 정보보안기사 | JAVA |
이 역시 다치 종속 관계라 할 수 있다.
DEVELOPER | CERTIFICATE |
---|---|
임버들 | 정보처리기사 |
임버들 | 빅데이터분석기사 |
성이경 | 정보보안기사 |
DEVELOPER | LANGUAGE |
---|---|
임버들 | C |
임버들 | C++ |
성이경 | JAVA |
위처럼 4NF를 만들 때, 해당 테이블에 조인 연산을 수행하면 이전 데이터와 다른 릴레이션이 생성된다.
DEVELOPER | CERTIFICATE | LANGUAGE |
---|---|---|
임버들 | 정보처리기사 | C |
임버들 | 정보처리기사 | C++ |
임버들 | 빅데이터분석기사 | C |
임버들 | 빅데이터분석기사 | C++ |
성이경 | 정보보안기사 | JAVA |
조인 종속을 제거하기 위해 (개발자, 자격증), (개발자, 언어) 뿐 아니라 (자격증, 언어) 관계에 대한 테이블을 만드는 것으로 조인시 원래의 데이터를 복구할 수 있다.
DEVELOPER | CERTIFICATE |
---|---|
임버들 | 정보처리기사 |
임버들 | 빅데이터분석기사 |
성이경 | 정보보안기사 |
CERTIFICATE | LANGUAGE |
---|---|
정보처리기사 | C |
빅데이터분석기사 | C++ |
정보보안기사 | JAVA |
DEVELOPER | LANGUAGE |
---|---|
임버들 | C |
임버들 | C++ |
성이경 | JAVA |
반정규화는 시스템의 성능 향상, 개발 및 운영의 편의성을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위이다.
반정규화를 통해 시스템의 성능이 향상되고 관리 효율성이 증가할 수 있지만 데이터의 일관성 및 정합성이 저하될 수 있다.
과도한 반정규화는 성능을 저하시킬 우려가 있다.
반정규화 방법으로 테이블 병합, 테이블 분할, 중복 데이터 추가, 중복 속성 추가 등이 있다.
테이블
테이블 병합
테이블 분할
테이블을 수직 또는 수평으로 분할하는 것으로 파티셔닝이라고도 한다.
중복 테이블 추가
대량의 데이터에 대한 집계함수(GROUP BY, SUM 등)를 사용하여 실시간 통계정보를 계산할 때 효과적 수행을 통해 별도 통계 테이블을 두거나 중복 테이블을 추가할 수 있다.
컬럼
관계