본문 바로가기

CS Knowledge/DataBase

DataBase - ERD, 정규화

 

ERD에 대해서 정리를 하려고 한다.

 

ERD

- 데이터베이스를 구축할 때 가장 기초적인 뼈대

- 이 부분을 먼저 신경써서 서비스를 구축해야한다.

- 건물을 지을 때, 골조로 생각.

- 시스템을 설계할때 시스템의 요구사항에 맞추어 설계하는 것이 일반적

 

 

"ERD란 시스템의 요구사항에 맞추어 데이터베이스에 있는 테이블간 관계도를 의미한다."

 

 

ERD의 장점, 단점

 

장점

  • 시스템 설계 중 디버깅 또는 비즈니스 프로세스 재설계시 참고 가능
  • 관계형 구조로 표현할 수 있는 데이터를 구성하는데 유용

단점

  • 비정형 데이터를 충분히 표현할 수 없다.

비정형 데이터 - 비구조화 데이터를 의미하며, 미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보.

 

 

ERD 예시

요구사항

- 영업사원은 0~N명의 고객을 관리한다.

- 고객은 0~N개의 주문을 넣을 수 있다.

 

이러한 요구를 ERD로 설계하는 것이다.

 

 

 

 

정규화

 

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

 

 

이상 현상

- 필요없는 데이터 삭제 시 필요한 데이터까지 삭제되는 경우

- 데이터를 삽입하는데 하나의 필드 값이 NULL이 되면 안되어서 삽입하기 어려운 경우 등

 

 

종류

- 제 1 정규형 (기본 정규형)

- 제 2 정규형

- 제 3 정규형

- 보이스/코드 정규형

- 제 4 정규형 (고급 정규형)

- 제 5 정규형 (고급 정규형)

 

 

정규형 원칙

- 같은 의미를 표현하는 릴레이션이지만 좀 더 좋은 구조로 만든다.

- 자료의 중복성을 감소시킨다.

- 독립적인 관계는 별도의 릴레이션으로 분리한다.

- 릴레이션은 독립적인 표현이 가능해야한다.

 

 

 

1. 제 1 정규형 ( 원자값 만들기 )

- 모든 도메인이 더 이상 분해될 수 없는 원자값으로만 구성되어야한다.

- 한 개의 기본키를 갖는 레코드의 속성 중 두개 이상의 값을 가져서는 안된다.

 

예시

유저번호 - ID - 이름 - 장바구니

1 - minsoo - 민수 - A, B, C

->

1 - minsoo - 민수 - A

1 - minsoo - 민수 - B

1 - minsoo - 민수 - C

 

- 하지만 테이블을 보면 레코드들이 아이디로 구별할 수 없다.

- 즉, 종속성 제거가 되어 있지않으며 기본키에 대해 나머지 속성이 완전 함수 종속적이지 않다.

 

 

 

 

2. 제 2 정규형 ( 완전 함수 종속적으로 만든다. )

- 제 1 정규형의 성질을 가진체 부분 함수의 종속성을 제거한 형태

- 종속성 제거 : 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적이게 만들어야 한다.

- 테이블의 분리를 의미하며 분리시 데이터는 무손실 분해가 되어야 한다.

 

완전 함수 종속

- 한개의 속성(기본키)에 다른 여러가지 속성이 종속되어 있다.

- 한개의 속성으로 레코드를 구별 가능하다.

 

예시

Table 1 (회원 목록)

1 - minsoo - 민수

 

Table 2 (장바구니 목록)

minsoo - A

minsoo - B

minsoo - C

 

 

 

 

3. 제 3 정규형 ( 이행적 종속성을 제거한다. )

- 제 2 정규형의 성질을 만족하면서 모든 속성이 이행적 함수 종속을 만족하지 않은 상태

 

이행적 함수 종속

- A가 B이고 B가 C이면 A는 C다. 이 때, C가 A에 이행적으로 종속되어 있다라고 한다.

 

예시

Table 1

1 - minsoo

 

Table2

minsoo - 민수

-> 유저번호가 1이고 아이디가 minsoo이면 이름이 민수임을 알 수 있는데 이를 분리.

 

 

 

 

4. 보이스/코드 정규형 ( 결정자는 후보키 중 하나여야 한다. )

- 제 3 정규형의 성질을 만족하면서 결정자가 후보키(기본키 or 대체키)가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 의미.

 

예시

(학번 - 수강명 - 강사) 라는 테이블 존재할 때, 만약 새로운 수업을 개설한 강사를 저장하려면 아직 수강한 사람이 없으므로 학번은 Null이 된다. 이를 (학번 - 수강명), (수강명 - 강사) 테이블로 나누어 오류가 발생하지 않게 한다.

 

(학번 - 수강명 - 강사)

2016 - 자바 - A

2016 - 파이썬 - B

2017 - 자바 - A

 

여기서 결정자의 후보는 (학번-수강명) or (수강명-강사) 인데, 이 두개의 결정자는 만약 위에처럼 데이터 삽입 시 결정자가 될 수 없다. 즉, 이 테이블은 함수 종속 관계의 결정자가 결정자의 후보에 속하지 않는다. 이런 경우 결정자의 후보 중에 결정자가 선정될 수 있도록 테이블을 분리한다.

 

 

 

 

 

 

 

 

 

 

 

'CS Knowledge > DataBase' 카테고리의 다른 글

DataBase - Join  (0) 2023.04.27
DataBase - Index  (0) 2023.04.26
DataBase - Type  (1) 2023.04.25
DataBase - Transaction and Integrity  (0) 2023.04.25
DataBase - Basic  (0) 2023.04.02