정규화(Normalization)란?

관계형 데이터베이스의 표를 열 사이의 함수 종속에 근거하여 분할하고, 같은 사실이 여러 곳에 기록되지 않게 하는 설계 절차. 데이터의 중복을 없애고 갱신 이상·삽입 이상·삭제 이상을 막는다. 제1정규형부터 제3정규형, 보이스-코드 정규형 등의 단계가 있다.

일본어 명칭: 正規化

정규화(Normalization)은(는) 데이터베이스 기초 등 1개 분야의 연습 문제 3개에 나와요.

분야: 데이터베이스 기초

정규화로 막는 이상

정규화하지 않은 표에서는 같은 사실이 여러 행에 중복되어 기록됩니다. 예를 들어 사원 표의 각 행에 부서명까지 갖게 하면, 부서명을 바꿀 때 그 부서 사원의 행을 모두 고쳐 써야 하며, 고쳐 쓰다가 빠뜨리면 내용이 서로 어긋납니다(갱신 이상). 사원이 아직 없는 부서는 등록할 수 없고(삽입 이상), 부서의 마지막 사원을 삭제하면 부서 정보까지 사라집니다(삭제 이상). 부서 정보를 다른 표로 나누면 하나의 사실을 한 곳에만 기록할 수 있어 이러한 이상을 막을 수 있습니다.

제1정규형부터 제3정규형까지

제1정규형은 모든 열이 반복 없는 하나의 값만 가지는 상태입니다. 제2정규형은 제1정규형이면서 기본 키의 일부에만 종속하는 열(부분 함수 종속)이 없는 상태로, 기본 키가 여러 열로 이루어진 표에서 문제가 됩니다. 제3정규형은 제2정규형이면서 기본 키 이외의 열을 거쳐 정해지는 열(이행적 함수 종속)이 없는 상태입니다. 예를 들어 수주번호 → 고객번호 → 고객명 같은 종속이 있으면 고객번호와 고객명을 다른 표로 나눕니다. 나눈 표는 공통 열로 조인하면 원래 표로 되돌릴 수 있도록(정보가 사라지지 않도록) 분할합니다.

반정규화와의 균형

정규화하면 중복은 없어지지만, 표가 나뉘는 만큼 검색할 때마다 조인이 필요해집니다. 읽기가 대부분을 차지하는 집계용 데이터베이스 등에서는 성능을 위해 일부러 표를 합쳐 중복을 갖게 하는 반정규화를 하는 경우가 있습니다. 그 경우에는 중복된 데이터를 맞춰서 갱신하는 구조가 필요해집니다. 갱신이 많은 업무 처리용 데이터베이스에서는 제3정규형까지의 정규화를 기본으로 하는 것이 일반적입니다.

도전해 보기: 정규화(Normalization) 관련 문제

관계형 데이터베이스의 표를 정규화하는 주된 목적은?

  1. A표의 수를 줄여서 어떤 검색이든 조인 없이 빠르게 할 수 있게 하는 것
  2. B데이터를 암호화하여 허가받지 않은 이용자가 읽지 못하게 하는 것
  3. C데이터의 중복을 없애고, 갱신했을 때 내용이 서로 어긋나는 등의 이상을 막는 것
정답과 해설 보기

정답: C. 데이터의 중복을 없애고, 갱신했을 때 내용이 서로 어긋나는 등의 이상을 막는 것

정규화는 열 사이의 함수 종속(어떤 열의 값이 정해지면 다른 열의 값이 하나로 정해지는 관계)에 근거하여 표를 분할하고, 같은 사실이 여러 곳에 기록되지 않게 하는 설계 절차입니다. 예를 들어 사원 표의 각 행에 부서명까지 적어 두면, 부서명을 바꿀 때 그 부서 사원의 행을 모두 고쳐 써야 하며, 고쳐 쓰다가 빠뜨리면 내용이 서로 어긋납니다(갱신 이상). 그 밖에도 사원이 아직 없는 부서를 등록할 수 없다(삽입 이상), 마지막 한 명의 사원을 삭제하면 부서 정보까지 사라진다(삭제 이상) 같은 문제가 생깁니다. 부서 정보를 부서 표로 나누어 두면 부서명은 한 곳만 고치면 됩니다. 한편 표가 나뉘는 만큼 검색할 때 조인이 늘어나므로, 정규화하면 검색이 빨라진다고는 할 수 없습니다.

수주 표(수주번호, 상품번호, 수량, 고객번호, 고객명)의 기본 키는 {수주번호, 상품번호}이고, 함수 종속은 {수주번호, 상품번호} → 수량, 수주번호 → 고객번호, 고객번호 → 고객명이다. 이 표를 제3정규형까지 정규화한 결과로 올바른 것은?

  1. A수주명세(수주번호, 상품번호, 수량, 고객번호), 고객(고객번호, 고객명)
  2. B수주명세(수주번호, 상품번호, 수량), 수주(수주번호, 고객번호), 고객(고객번호, 고객명)
  3. C수주명세(수주번호, 상품번호, 수량), 수주(수주번호, 고객번호, 고객명)
정답과 해설 보기

정답: B. 수주명세(수주번호, 상품번호, 수량), 수주(수주번호, 고객번호), 고객(고객번호, 고객명)

제2정규형은 제1정규형이면서 기본 키의 일부에만 종속하는 열(부분 함수 종속)이 없는 상태입니다. 수주번호 → 고객번호는 기본 키의 일부인 수주번호만으로 고객번호가 정해지는 부분 함수 종속이므로, 원래 표는 제1정규형이지만 제2정규형이 아닙니다. 수주번호로 정해지는 열을 수주(수주번호, 고객번호, 고객명)로 나누면 제2정규형이 됩니다. 제3정규형은 제2정규형이면서 기본 키 이외의 열을 거쳐 정해지는 열(이행적 함수 종속)이 없는 상태입니다. 수주 표에는 수주번호 → 고객번호 → 고객명이라는 이행적 함수 종속이 남아 있으므로, 고객(고객번호, 고객명)을 다시 나눕니다. 이렇게 하여 수주명세(수주번호, 상품번호, 수량), 수주(수주번호, 고객번호), 고객(고객번호, 고객명)의 3개 표가 제3정규형이 됩니다. 나눈 표는 수주번호나 고객번호로 조인하면 원래 표로 되돌릴 수 있습니다.

자주 묻는 질문

제2정규형과 제3정규형의 차이는 무엇인가요?

제2정규형은 기본 키의 일부만으로 정해지는 열(부분 함수 종속)이 없는 상태입니다. 제3정규형은 거기에 더해 기본 키 이외의 열을 거쳐 정해지는 열(이행적 함수 종속)도 없는 상태입니다. 기본 키가 한 열인 표는 제1정규형이면 자동으로 제2정규형이 됩니다.

정규화하면 검색이 빨라지나요?

빨라진다고는 할 수 없습니다. 정규화의 목적은 중복을 없애 갱신 시의 이상을 막는 것이며, 표가 나뉘는 만큼 검색에는 조인이 늘어납니다. 읽기 성능이 중요한 경우에는 일부러 반정규화하기도 합니다.

해설 속 정규화(Normalization)

정규화(Normalization)이(가) 나오는 문제 (3)

  1. 관계형 데이터베이스의 표를 정규화하는 주된 목적은?
  2. 수주 표(수주번호, 상품번호, 수량, 고객번호, 고객명)의 기본 키는 {수주번호, 상품번호}이고, 함수 종속은 {수주번호, 상품번호} → 수량, 수주번호 → 고객번호, 고객번호 → 고객명이다. 이 표를 제3정규형까지 정규화한 결과로 올바른 것은?
  3. 읽기가 대부분을 차지하는 집계용 데이터베이스에서 정규화한 표를 일부러 하나로 합쳐 같은 데이터를 중복해서 갖게 하는 설계(반정규화)를 하는 경우가 있다. 이 설계의 장점과 단점의 조합으로 올바른 것은?

관련 용어

관계형 데이터베이스(Relational Database) 기본 키(Primary Key) 제3정규형(3NF) 2단계 로킹(2PL) 격리 수준(Isolation Level) 뷰(View) 외래 키(Foreign Key) 인덱스(Index) 트랜잭션(Transaction) ACID 특성(ACID Properties)

용어집으로 돌아가기