CSㅣERD와 정규화 과정

휘Bin·2024년 1월 8일
0
post-thumbnail

ERD와 정규화 과정

ERD와 정규화 과정

ERD(Entity Relationship Diagram)데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하고, 릴레이션 간의 관계들을 정의한 것이다. 서비스를 구축할 때 가장 먼저 신경 써야 할 부분일 것이다.

ERD의 중요성

ERD의 중요성

ERD시스템의 요구 사항을 기반으로 작성되며, ERD를 기반으로 데이터베이스를 구축한다. 데이터베이스를 구축한 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우에 설계도 역할을 담당하기도 한다.

하지만 ERD는 관계형 구조로 표현할 수 있는 데이터를 구성하는데 유용할 수 있지만, 비정형 데이터를 충분히 표현할 수 없다는 단점이 있다.

※ 비정형 데이터
: '비구조화 데이터'를 말하며, 미리 정의된 데이터 모델이 없거나, 미리 정의된 방식으로 정리도지 않은 정보를 말한다.

정규화 과정

정규화 과정

'정규화 과정'은 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정이다.

데이터베이스 이상 현상이란, 캐릭터가 1개의 등급을 가져야 하는데 3개의 등급을 갖거나, 삭제할 때 필요한 데이터가 같이 삭제 되거나, 등등의 현상을 말한다.

'정규화 과정'정규형 원칙을 기반으로 정규형을 만들어가는 과정이며, 정규화된 정도는 '정규형(NF, Normal Form)으로 표현한다. '기본 정규형'인 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형이 있고, '고급 정규형'인 제4정규형, 제5정규형이 있다. 이 글에서는 기본 정규형에 대해서 알아보고자 한다.

정규형 원칙

'정규형 원칙'이란, 같은 의미를 표현하는 릴레이션이지만 더 좋은 구조로 만들어야 하며, 자료의 중복성은 감소해야 하고, 독립적인 관계는 별개의 릴레이션으로 표현해야 하고, 각각의 릴레이션은 독립적인 표현이 가능해야 하는 것을 뜻한다.

제1정규형

릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자값(atomic value)만으로 구성되어야 한다. 릴레이션의 속성 값 중 1개의 기본키에 대해 2개 이상의 값을 가지는 반복집합이 있어선 안된다. 만약 반복 집합이 있다면 제거해야 한다.

위 그림의 예시에서 반복 집합을 제거하는 것을 볼 수 있을 것이다.

제2정규형

릴레이션이 제1정규형이면서 부분 함수의 종속성을 제거한 형태를 말한다.

부분 함수의 종속성 제거란, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것을 말한다.

위 그림을 보면 기본키인 {유저ID, 속성명}과 완전 종속된 유저번호 릴레이션과 '{유저ID, 속성명}에 따른 진행도' 릴레이션으로 분리된 것을 볼 수 있다.

조심해야 할 점은, 릴레이션을 분해할 때 동등한 릴레이션으로 분해해야 하며, 정보 손실이 발생하지 않는 '무손실 분해'로 분해되어야 한다는 것이다.

제3정규형

제2정규형이고, 기본키가 아닌 모든 속성이 '이행적 함수 종속(transitive FD)을 만족하지 않는 상태'를 말한다.

이행적 함수 종속

이행적 함수 종속은, A->B와 B->C가 존재하면, 논리적으로는 A->C가 성립하는데, 이 때 '집합 C가 집합 A에 이행적으로 함수 종속이 되었다'고 한다.
예시를 보여주면 아래와 같다.

보이스/코드 정규형

보이스/코드 정규형(BCNF)은, 제3정규형이고, 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 뜻한다.

※ 결정자
: 함수 종속 관계에서 특정 종속자(dependent)를 결정짓는 요소, 'X->Y'일 때, X는 결정자, Y는 종속자이다.

예를 들어 요구사항이 아래와 같다고 생각해보자.

  • 각 개발수업에 대해 한 학생은 오직 한 강사의 강의만 수강한다.

  • 각 강사는 한 개발수업만 담당한다.

  • 한 개발수업은 여러 강사가 담당할 수 있따.

    학번-개발수업-강사 릴레이션은 아래와 같을 수 있다.

    위의 릴레이션을 보면, {학번, 개발수업} 또는 {학번, 강사}가 후보키가 되고, 만약 이승재라는 강사가 '코딩테스트'라는 개발수업을 진행한다고 할 때, 이를 삽입하면 학번이 NULL이 되는 문제점이 발생한다.

즉, 강사 속성이 결정자이지만 후보키가 아니므로, 이 강사 속성을 분리해야 한다.
아래와 같이 말이다.

위 그림을 보면 코딩테스트-이승재가 제대로 들어가고, 학번-강사/개발수업-강사로 잘 분해된걸 볼 수 있다.

정규형 과정을 거쳐 테이블을 나눈다고 해서 성능이 100% 좋아지는 것은 아니다. 성능이 좋아질 수도 나빠질 수도 있다. 테이블을 나누게 되면 어떤 쿼리는 조인을 해야 하는 경우가 발생해 오히려 느려질 수도 있기 대문에, 서비스에 따라 정규화 또는 비정규화 과정을 진행할 필요가 있다.

profile
One-step, one-step, steadily growing developer

0개의 댓글