[개발자 대화를 위한 넓고 얕은 CS 지식] ERD와 정규화 과정

Joosi_Cool·2023년 5월 22일
3
post-thumbnail

이번 블로깅에 대해선 ERD와 정규화 과정 에 대해 넓고 얕게 알아보자.

ERD란?

우선 ERD 가 무엇인지부터 알아보자.
이는 Entity Relationship Diagram의 약자로 데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션 간의 관계들을 정의한 것을 말한다.

  • 릴레이션이란?

    이는 데이터베이스에서 정보를 구분하여 저장하는 기본 단위를 말한다. 우리가 쉽게 아는 용어로는 테이블이라고도 불리며, 컬렉션이라고도 불린다.

우리가 서비스를 구축할 때, 가장 먼저 신경 써야할 부분이며 건물의 뼈대와 같은 역할을 한다.

ERD의 중요성

ERD는 앞서 말한 것처럼 건물의 뼈대 역할을 하는 아주 기본적으로 고려해야 하는 것이다.
이는 시스템의 요구 사항을 기반으로 작성되며, 이를 기반으로 데이터베이스를 구축하게 된다. 데이터 베이스가 구축되고 난 이후에도, 이를 가지고 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우에 설계도 역할을 한다.

이는 관계형 구조에서는 표현할 수 있는 데이터를 구성하는 데 유용할 수 있지만 비정형 데이터를 충분히 표현할 수 없다는 단점도 존재한다.

ERD를 쉽게 배울 수 있는 예제

만약에 위와 같은 요구사항 있다고 가정해보면 정답과 같은 ERD를 설계할 수 있다. 이처럼 ERD는 요구사항에 맞게 릴레이션 간의 관계를 정의한 것이다.



정규화 과정이란?

이제는 그렇다면 정규화 과정 이란 무엇일까? 이에 대해 알아보자.

  • 정규화 과정이란?

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

  • 데이터베이스 이상 현상이란?

    위에서 말한 데이터베이스 이상 현상이란, 회원이 한 개의 등급을 가져야 하는데 세 개의 등급을 갖거나 삭제할 때 필요한 데이터가 같이 삭제되고, 데이터를 삽입해야 하는데 하나의 필드 값이 NULL이 되면 안 되어서 삽입하기 어려운 현상을 말한다.

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

그렇다면 이들에 대해 각각 알아보는 시간을 가져보자.



정규형 원칙

우선에 각각에 들어가기 전에 정규형 원칙에 대해 알아보자.

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

제1정규형

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

위와 같은 경우는 학번이 100인 값에 반복 집합이 있다. 그래서 이를 제거하면 아래와 같아진다.

이처럼 한 개의 기본키에 대해 한 개의 값만을 가져야 한다.


제2정규형

릴레이션이 제 1정규형이며, 부분 함수의 종속성을 제거한 형태를 말한다.
부분 함수의 종속성을 제거..??
이 말이 무엇일까 알아보자.
이는 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것을 말한다.

위에서 정리해놨던 제1정규형의 자료에서 완전 함수 종속이 되도록 릴레이션을 분해 시켜주었다. 이처럼 할때 주의해야 할 점은 아래와 같다.

  • 분해 시 주의점
  1. 동등한 릴레이션으로 분해해야 한다.
  2. 정보 손실이 발생하지 않는 무손실 분해로 분해해야 한다.

제3정규형

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

  • 이행적 함수 종속이 무엇일까?

    이는 A->B와 B->C가 존재하면 논리적으로 A->C가 성립하는데, 이때 집합 C가 집합 A에 이행적으로 함수 종속 되었다고 말한다.


보이스/코드 정규형

이는 제3정규형에 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태 를 말한다.

  • 결정자란?

    함수 종속 관계에서 특정 종속자를 결정 짓는 요소를 말한다. X->Y 여기서 X는 결정자, Y는 종속자이다.

예시로 위와 같이 데이터가 있다고 가정해보자.
위에는 제3정규형이 맞는다. 이때 무슨 문제가 있을까?
1. 삽입 이상 : 새로운 교수가 특정 과목을 담당한다는 새로운 정보를 추가할 수 없다. 적어도 한 명 이상의 수강 학생이 필요하다.
2. 삭제 이상 : 학번 100이 C234 과목을 취소하면, P2가 C234 과목을 담당한다는 정보도 삭제된다.
3. 갱신 이상 : P1의 과목이 변경되면 P1인 행을 모두 찾아 변경시켜주어야 한다.

위의 말을 천천히 읽어보면 어떤 부분에서 문제가 생기는지 이해가 갈 것이다.
이를 해결하기 위해 나온 것이 보이스/코더 정규형이다.

이를 해결해주기 위해서는 위에 데이터 기준으로 담당 교수로 분해하면 된다.
즉, 모든 결정자는 항상 후보키가 되도록 릴레이션을 분해 하면 된다는 뜻이다.



마무리

지금까지 배운 정규화 과정을 거쳐 테이블을 나눈다고 했을때, 항상 성능이 좋아지는 것은 아니다. 구조와 요구사항을 잘 파악하고 상황에 맞게 정규화 과정 또는 비정규화 과정을 진행해야 한다.

이번 블로깅에선 ERD와 정규화 과정에 대해 알아보았다. 이 블로깅의 목적은 깊게 배우는 것이 아니라 개발자 대회에 낄 정도의 넒고 얕은 지식을 목표로 하고 있다. 이 블로깅을 통해서 전체적인 ERD와 정규화 과정 에 대해 잡았으면 좋겠다. 그리고 감을 잡았고 좀 더 깊게 배우고 싶다면 이 블로깅의 키워드를 길로 잡아서 하나씩 공부해 나간다면 매우 도움이 될 것이라고 생각한다.

profile
집돌이 FE개발자의 노트

0개의 댓글