[MySQL] 데이터베이스 정규화에 대하여 끄적끄적

WANGGEON LEE
5 min readJun 8, 2021

오늘은 데이터베이스 데이터 정규화(Normalization)에 대해 끄적끄적 해보려 합니다.

데이터베이스 정규화는 왜 하는 것인가?

— — — — — — — — — — — — — — — — —

IT(정보기술) 용어로, 카노니컬라이즈(Canonicalize)라고도 한다. 정규화는 전 분야에서 사용되고 있는 용어로, 사용하는 분야에 따라 그 의미가 크게 달라진다.

사용 빈도가 가장 높은 것은 ‘관계형 데이터베이스(RDB:relational database)의 정규화'이다. 관계형 데이터베이스에서는 데이터의 보존성을 높이는 등의 목적에서 데이터베이스 내에서 같은 정보가 2번 이상 기록되지 않고, 테이블 하나 하나는 주 키에서 직접 연상되는 데이터만으로 구성되도록 설계하는 것이 이상적이다.

출처 : 두산백과 (https://terms.naver.com/entry.naver?docId=1232063&cid=40942&categoryId=32837https://terms.naver.com/entry.naver?docId=1232063&cid=40942&categoryId=32837)

관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업이다. 구체적으로는 정리가 되지 않은(더러운), 나쁜 관계의 속성(attribute)들을 나누어서 좋은 관계로 재배치하는 작업을 말한다. 정규화 과정을 거치게 되면 정규형을 만족하게 된다. 정규형이란 특정 조건을 만족하는 관계의 스키마 형태를 말하면 제1정규형, 제2정규형, 제3정규형 … 등이 존재한다.

데이터의 거품을 빼는 과정

데이터 정규화의 특징은 ‘최소화'와 ‘중복' 2가지 키워드로 축약할 수 있다. 이렇게 중복되는 데이터를 최소화시켜 데이터를 관리한다면 단위 정보의 크기가 작아지기 때문에 쿼리(Query)문을 통해 검색하고 입력하고 업데이트 등 효율적이고 빠르게 관리할 수 있을 것이다.

데이터 정규화 과정

이와 같이 정의될 수 있다.

무슨 말인지 잘 모르겠으니 하나하나 뜯어보겠다.

  1. 그렇다면 위에 말한 나쁜 관계가 생성되어 있는 데이터란 무엇인가?

데이터를 구성하고 있는 속성 간에 함수적 종속성을 판단한다. 판단된 함수적 종속성(Functional Dependency)은 좋은 관계의 정형적 기준으로 사용되곤 하는데, 즉 각각의 정규형 마다 어떠한 함수적 종속성을 만족하는지에 따라 정규형이 정의되고, 그것을 충족하지 못한 경우가 바로 나쁜 관계의 데이터로 파악한다.

2. 함수적 종속성이란?

함수적 종속성이란 속성 데이터들의 의미와 속성들 간의 상호 관계로부터 오는 제약 조건이라고 할 수 있다. X와 Y를 어떤 속성을 갖는 데이터의 집합이라고 할 때, X 값이 Y값을 유일하게 결정한다면 ‘X는 Y를 함수적으로 결정한다'라고 할 수 있다. 함수적 종속성은 현실 세계에 있는 속성들 사이의 제약 조건으로부터 온다. 또한 각종 규칙에 따라서 속성들간의 함수적 종속성을 판단할 수 있다.

3. 각각의 정규형은 어떤 조건을 만족하는가?

  • 제 1 정규형

속성의 도메인이 오직 원자값만을 포함하며 하나의 값만을 가져야 한다. 즉 다중값 속성, 중첩 관계 등 비 원자적인 방식을 허용하지 않는 형태를 말한다.

  • 제 2 정규형

모든 비 주요 속성들이 주요 속성에 대해 완전 함수적 종속이면(부분 함수적 종속을 모두 제거) 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X->Y라고 가정할 때, X의 어떠한 것이라도 제거한다면 더이상 함수적 종속성이 성립하지 않는 경우을 말한다.

  • 제 3 정규형

어떠한 비주요 속성도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X->Y, Y->Z일때 추론될 수 있는 X->Y의 종속관계를 말한다.

  • BCNF 정규형

복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있다. 함수적 종속성을 분해하는 과정을 말한다.

4. 정규화의 장점

4–1 DB변경 시 이상 현상 제거

4–2 DB 구조 확장 시 재 디자인 최소화

정규화된 DB 구조에서는 새로운 데이터로 인한 추가 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도됨으로써, 최소한의 영향 만을 미치게 된다.

4–3 유저에게 데이터 모델을 더욱 의미있게 전달

데이터들 간의 관계가 현실 세계의 개념들을 더욱 더 잘 반영하게 된다.

5. 정규화의 단점

정규화를 하게 되면 데이터를 결정하는 결정자에 의해 완전 함수적 종속성을 가지게 되는 것이고, 이것은 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 속성이 하나의 테이블로 집약되므로 데이터 용량이 최소화되는 효과가 있으므로 데이터 처리 속도가 빨라지게 된다. but!

대표적으로 느려지는 현상이 하나 있는데 그것은 바로 JOIN연산이다. 관계의 분해로 관계 간의 연산(JOIN)이 음청 많아질 수 있다. 음청 많아지면 응답 간도 그만큼 음청 느려질 수 있다는 점!

6. 단점을 미루어 볼때, 어떠한 상황에서 정규화를 해야하는가?

대표적으로 JOIN 연산을 많이 해야 하는 DB의 경우 반정규화 전략이 필요하다.

  • 자주 사용되는 테이블에 접근하는 과정의 수가 많고 항상 일정한 범위만을 조회하는 경우
  • 성능 상 이슈가 발생했을 경우(연산하는 과정에서.. 등)
  • 테이블에 지나치게 많이 JOIN을 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

— — — — — — — — — — — —

  • 끝맺음

데이터의 무결성을 확보하며 중복 제거 등 데이터들 간의 관계를 최소화 시키는 정규화를 진행하는 것만이 무조건적으로 올바른 방법은 아니며 상황에 따라 데이터의 관계를 설정하는 것이 우리의 역할이라고 생각한다. (하지만 매우 어렵지)

그럼 20000

--

--