본문 바로가기
cs/면접을 위한 CS 전공지식 노트

4-2. ERD와 정규화 과정

by 이쟝 2022. 10. 28.
더보기

2022.09.19 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 1-1. 디자인 패턴(1)

2022.09.20 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 1-1. 디자인 패턴(2)

2022.09.20 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 1-2. 프로그래밍 패러다임(함수형,객체지향,절차적프로그래밍)

2022.09.22 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-1. 네트워크의 기초(토폴로지&성능분석 명령어)

2022.09.23 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-2. TCP/IP 4계층 모델

2022.09.27 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-3. 네트워크 기기(스위치 등)/IP주소

2022.10.02 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-4.HTTP

2022.10.04 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-1. 운영체제의 구조와 역할 및 컴퓨터의 구조

2022.10.07 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-2. 메모리계층 및 메모리 관리

2022.10.10 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-3. 프로세스와 스레드(1): 프로세스의 컴파일과정, 상태, 메모리 구조, PCB

2022.10.14 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-3. 프로세스와 스레드(2): 멀티프로세싱

2022.10.24 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-4. CPU 스케줄링 알고리즘

2022.10.27 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 4-1. 데이터베이스의 기본(엔터티의 관계, 데이터 타입 최적화, 관계, 키)

ERD(Entity Relationship Diagram)

개체-관계 모델. 테이블간의 관계를 설명해주는 다이어그램

데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하고, 릴레이션 간의 관계를 정의

만약 서비스를 구축한다면 가장 먼저 신경 써야 할 부분

프로젝트에서 사용되는 DB의 구조를 한눈에 파악할 수 있다.

API를 효율적으로 뽑아내기 위한 모델 구조도

 

2-1. ERD의 중요성

  1. ERD는 시스템의 요구 사항을 기반으로 작성되며 이 ERD를 기반으로 데이터베이스를 구축한다.
  2. 데이터베이스를 구축한 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우에 설계도 역할을 담당한다.
  3. ERD를 사용하게 되면 DB 테이블간의 관계나 전체 구조를 한 눈에 파악할 수 있다.
  4. ERD는 관계형 구조로 표현할 수 있는 데이터를 구성하는 데 유용할 수 있지만 비정형 데이터를 충분히 표현할 수 없다는 단점이 있다.
비정형 데이터(unstructured data): 비구조화 데이터를 말하며, 미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보
- 정의된 구조가 없는 동영상 파일, 오디오 파일, 사진, 보고서, 메일 본문 등과 같이 정형화 되지 않은 데이터
- 정채진 규칙이 없어서 값의 의미를 쉽게 파악하기 힘들다. 
- 데이터는 형태에 따라 정형 데이터, 반정형 데이터, 비정형 데이터로 분류된다.

2-2. 예제로 배우는 ERD

다음 예제의 서비스 요구 사항과 답을 기반으로 ERD를 작성하며 공부하기!

승원 영업부서의 ERD
요구사항

  1. 영업사원은 0~n명이 고객을 관리한다.
  2. 고객은 0~n개의 주문을 넣을 수 있다.
  3. 주문에는 1~n개의 상품이 들어간다. 

무무오브레전드의 ERD

요구사항

  1. 선수들은 1명의 챔피언을 고를 수 있다.
  2. 챔피언은 한 개 이상의 스킬을 갖는다.
  3. 스킬은 한 개 이상의 특성을 갖는다. 

2-3. 정규화 과정

릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션내에서 중복을 제거하는 과정

데이터베이스 정규화의 목적

불필요한 데이터(data redundancy)를 제거, 데이터의 중복을 최소화하기 위해서(저장 공간 최소화) 각종 이상 현상(Anomaly)을 방지하기 위해서, 테이블의 구성을 논리적이고 직관적으로 한다.(이상현상 방지)
데이터 테이블 구성이 논리적, 직관적으로 하기 위해서(자료 구조의 안정성 최대화) 다양한 관점에서의 쿼리를 지원하기 위해서(효과적인 검색 알고리즘)
무결성 제약조건의 시행을 간단하게 하기 위해서(데이터 무결성 유지)
데이터베이스 이상 현상(Anomaly): 잘못된 테이블 설계로 인해 데이터 중복성에 의해서 발생되는 데이터 불일치 현상. 크게 삽입 이상, 삭제 이상, 갱신 이상으로 구성된다.
(1) 삽입 이상(Insertion anomaly)
특정 데이터가 존재하지 않아 중요한 데이터를 데이터베이스에 삽입할 수 없을 때 발생(불필요한 정보를 함께 저장하지 않고서는 어떤 정보를 저장하는 것이 불가능함)
(2) 삭제 이상(deletion anomaly)
특정 정보를 삭제하면, 원치 않는 정보도 삭제되는 현상
(3) 갱신 이상(update anomaly)
특정 데이터를 업데이트 했는데 정상적으로 변경되지 않은 경우나 너무 많은 행을 업데이트 하는 것

정규화의 장점과 단점

장점 단점
응용 프로그램 단에서 불필요한 로직을 없앨 수 있다. 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다.
올바른 데이터만 얻을 수 있다.(변칙 방지)
불필요한 쿼리(ex, 서브 쿼리)제거로 성능 향상

정규화 과정은 정규형 원칙을 기반으로 정규형을 만들어가는 과정이며, 정규화된 정도는 정규형(NF, Normal Form)으로 표현한다. 

기본 정규형 고급 정규형
제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형 제4정규형, 제5정규형

1. 정규형 원칙

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

2. 제1정규형(제1 정규화:1NF)

릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값(atomic value)만으로 구성되어야 한다.

  • 릴레이션의 속성 값 중에서 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있어서는 안된다. 
  • 기본 키를 사용해 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.

제1정규화

 

  1. 현재 테이블은 속성 하나는 하나의 속성값만을 가져야 한다는 1차 정규형에 위배된다.
  2. 수강과목컬럼에서 봄이 수학과 국어 속성값 두 개를 가지고 있기에 이를 분리한다.

3. 제2정규형

릴레이션이 제1정규형이며 부분 함수의 종속성을 제거한 형태

부분 함수의 종속성 제거: 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것

  1. 제 1정규화를 거친 테이블을 보면 중복데이터로 인해 학생이름으로 ROW를 구분할 수 없고 나이 또한 ROW를 구분할 수 없다.( {학생이름, 수강과목} 기본키로만 각 ROW를 구분 가능)
  2. 나이가 학생이름에 종속되어있기 떄문에 이름만 알아도 나이를 알 수 있다.
  3. 기본키 중에 특정 컬럼에만 종속된 컬럼이 존재한다면 2차 정규형에 위배된다.
  4. 그래서 학생 릴레이션과 수강과목 릴레이션으로 분리된 것을 볼 수 있다.

릴레이션을 분해할 때 동등한 릴레이션으로 분해해야 하고, 정보 손실이 발생하지 않는 무손실 분해로 분해되어야 한다.

무손실 분해: 한 릴레이션을 분리헀을 때 R1, R2 두가지 릴레이션이 나오게 되는데 R1, R2를 교집합 했을 때 나오는 값은 R1의 키이거나, R2의 키이다.
ex) (학번, 과목), (교수, 과목)은 교집합의 결과가 과목이고, 과목은 한쪽의 키가 아니기 때문에 무손실 분해 xx
      (학번, 교수), (교수, 과목)은 교집합의 결과과 교수이고, 교수는 한쪽 테이블의 기본키이기에 무손실 분해!

4. 제3정규형

제2정규형을 만족하는 상태에서 기본키가 아닌 모든 속성이 이행적 함수 종속(transitive FD)을 제거하는 과정

이행적 함수 종속

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

  1. 제 3정규화를 거치면 등급 릴레이션과 할인율 릴레이션으로 나뉘게 된다.

5. 보이스/코드 정규형(BCNF: Boyce-Codd Normal Form)

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

  • 후보키를 여러개 가지고 있는  릴레이션에서는 제3정규형을 만족하더라도 이상현상이 생길 수 있기 때문에 보이스/코드 정규형을 사용한다.
  • 제3규형보다 조금 더 엄격한 제약조건을 가지기 때문에 Strong 3NF 라고도 한다.
결정자: 함수 종속 관계에서 특정 종속자(dependent)를 결정짓는 요소, 'X->Y'일 때 X는 결정자, Y는 종속자

ex) 요구사항  

  1. 각 수강명에 대해 한 학생은 오직 한 강사의 강의만 수강한다.
  2. 각 강사는 한 수강명만 담당한다.
  3. 한 수강명은 여러 강사가 담당할 수 있다.

학번 - 수강명 - 강사 릴레이션

  1. 예시를 보면 {학번, 수강} 또는 {학번, 강사}가 후보키가 되며, 만약 다다라는 강사가 Java라는 수강명을 담당한다고 했을 때 이를 삽입하면 학번이 NULL이 되는 문제점이 발생한다. 
  2. 또한 학번은 강사에 종속되는데, 강사는 수강명에 종속된다는 문제점이 발생한다. 
  3. 즉 강사 속성이 결정자이지만 후보키가 아니기 때문에 강사 속성을 분리해야 한다. 

보이스/코드 정규형을 만족한 릴레이션

정규형 과정을 거쳐 테이블을 나눠도 성능이 100% 좋아지는 것은 아니다. 

테이블을 나누게 되면 어떠한 쿼리는 조인을 해야하는 경우도 발생해서 오히려 느려질 수 있기 때문에 서비스에 따라 정규화 비정규화 과정을 진행해야 한다. 

 

 

 

 

 

 

 

 

 


ERD란?

정형, 비정형, 반정형 데이터

정규화

[데이터베이스]이상 현상

제 1정규화, 제 2정규화, 제 3정규화

정규화과정