※ 데이터 베이스(+주홍철)_복습(2)
ERD(모델링)와 정규화 과정
- ERD(Entity Relationship Diagram)
: 데이터 베이스를 구축할 때, 가장 기초적인 뼈대 역할을 하며, 릴레이션(테이블) 간의 관계들을 정의한 것이다.
: 서비스를 구축한다면 가장 먼저 신경써야 할 부분이다.
: 신경쓰지않고 구축하지 않을시 단단하지 않은 골조로 건물을 짓는 것이다.
ERD의 중요성
: ERD는 시스템의 요구 사항을 기반으로 작성되며 이 ERD를 기반으로 데이터베이스를 구축한다.
: DB를 구축한 이후에도 디버깅 또는 비즈니스 프로세스 재설계가 필요한 경우에 설계도 역할을 담당하기도 한다.
: ERD는 관계형 구조로 표현할 수 있는 데이터를 구성하는데 유요할 수 있지만 비정형 데이터를 충분히 표현할 수 없다라는 단점
**비정형 데이터 : 비구조화 데이터를 말하며, 미리 정의된 데이터 모델이 없거나 미리 정의된 방식으로 정리되지 않은 정보를 말함
정규화 과정
: 릴레이션(테이블) 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로
사용하기 위해 릴레이션(테이블)을 여러 개로 분리하는 과정이다.
데이터베이스 이상 현상
: 회원이 1개의 등급을 가져야 하는데, 3개의 등급을 갖는 경우
: 삭제할 때 필요한 데이터가 같이 삭제되는 경우
: 데이터를 삽입해야하는데 하나의 필드값이 NULL이 되면 안 돼서 삽입하기 어려운 경우
정규화 과정
: 정규형 원칙을 기반으로 정규형을 만들어가는 과정이다.
: 정규화된 정도는 정규형(NF, Normal Form)으로 표현된다.
: 기본 정규형인 제1 정규형, 제2 정규형, 제3 정규형, 보이스/코드 정규형이 있고, 고급 정규형인 제4 정규형, 제5 정규형이 있다.
정규형 원칙
: 같은 의미를 표현하는 릴레이션(테이블)이지만 좀 더 좋은 구조로 만들어야 하고, 자료의 중복성은 감소해야 한다.
독립적인 관계는 별개의 릴레이션(테이블)으로 표현해야 하며, 각각의 릴레이션은 독립적인 표현이 가능해야 한다.
정규화 목적
: 데이터 중복 최소화
: 데이터 이상(삽입 / 수정 / 삭제 ) 방지
: 테이블 간 독립성 확보
(좋은 구조로 만들고, 자료의 중복성은 감소, 독립적인 관계로 테이블을 표현하기 위해 정규형 규칙을 가진다.)
제1 정규형 (테이블=릴레이션)
: 테이블의 모든 도메인(속성의 값(집합))이 더 이상 분해될 수 없는 값으로만 구성되어야 한다.
: 테이블의 속성 값 중에서 한 개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있어서는 안 된다.
: 반복 집합이 있다면 제거
예시
[기본 테이블]
유저번호 유저ID 수강명 성취도
1 홍철 { C++코테, 프런트특강 } { 90%, 10% }
2 범석 { 코드포스, DS 특강 } { 7%, 8% }
[제1 정규형을 거친 테이블]
유저번호 유저ID 수강명 성취도
1 홍철 C++코테 90%
1 홍철 프런트특강 10%
2 범석 코드포스 7%
2 범석 DS특강 8%
==> 홍철이란 ID에 수강명이 { C++코테, 프런트특강 } 이 있었는데, 나눠서 반복된 집합을 제거
제2 정규형(테이블=릴레이션)
: PK 전체에 의존하지 않는 컬럼 분리
: 테이블이 제1 정규형이며 부분 함수의 종속성을 제거한 형태이다.
**부분 함수의 종속성 제거란 ? 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것을 말한다.
[제1 정규형을 거친 테이블]
유저번호 유저ID 수강명 성취도
1 홍철 C++코테 90%
1 홍철 프런트특강 10%
2 범석 코드포스 7%
2 범석 DS특강 8%
[제2 정규형을 거친 테이블]
**기본키값(유저번호, 유저ID)
유저번호 유저ID
1 홍철
2 범석
유저ID 수강명 성취도
홍철 C++코테 90%
홍철 프런트특강 10%
범석 코드포스 7%
범석 DS 특강 8%
==> PK(유저번호, 유저ID)과 완전 종속된 유저번호 릴레이션과 (유저ID, 수강명)에 따른 성취도 릴레이션으로 분리된 것이다.
**주의할 점
: 릴레이션을 분해할 때 동등한 릴레이션으로 분해해야 하고, 정보 손실이 발생하지 않는 무손실 분해로 분해되어야 한다.
**(손실 : 값이 추가, 삭제, 수정 등)
제3 정규형
: 제2 정규형이고 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않은 상태이다.
**이행적 함수 종속 : A => B와 B => C가 존재하면 논리적으로 A => C가 성립하는데, 이 때 집합 C가 집합 A에 이행적으로 함수
종속이 되어야 한다.
[예시]
유저ID 수강명 성취도
홍철 C++코테 90%
범수 프런트특강 10%
가영 DS 특강 8%
[제3 정규형을 거친 테이블]
: A->B B->C 참조(외래)값을 두고 테이블 분리 이행적 함수 종속 제
(테이블1) (테이블2)
유저ID 수강명 수강명 성취도
홍철 C++코테 C++코테 90%
범수 프런트특강 프런트특강 10%
가영 DS특강 DS 특강 8%
보이스/코드 정규형
: 보이스/코드 정규형(BCNF)은 제3정규형이고, 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태
**결정자 : 함수 종속 관계에서 특정 종속자(dependent)를 결정짓는 요소 'X->Y'일 때 X는 결정자, Y는 종속자이다.
ex)
요구 사항은 다음과 같다고 해보자
- 각 수강명에 대해 한 학생은 오직 한 강사의 강의만 수강한다.
- 각 강사는 한 수강명만 담당한다.
- 한 수강명은 여러 강사가 담당할 수 있다.
학번 수강명 강사
12010 코딩테스트 큰돌
12010 MEVN 재엽
12011 코딩테스트 큰돌
12011 MEVN 가영
NULL 롤 범석 <----삽입 이상
--> 릴레이션을 보면 {학번, 수강명} 또는 {학번, 강사}가 후보키가 되며, 만약에 범석이라는 강사가 "롤"이라는 수강명을 담당한다고 했을 때 이를 삽입하면 학번이 NULL이 되는 문제점이 발생!
즉, 강사 속성이 결정자이지만 후보키가 아니므로 이 강사 속성을 분리해야 한다.
학번 강사 수강명 강사
12010 큰돌 코딩테스트 큰돌
12010 재엽 MEVN 재엽
12011 큰돌 MEVN 큰돌
12011 가영 롤 범석
--> 롤 , 범석이 제대로 들어갔으며 학번-강사, 수강명-강사로 잘 분해된 모습이다.
'SQL 연습' 카테고리의 다른 글
| ※ 데이터 베이스(+주홍철)_복습(1) (0) | 2025.11.02 |
|---|---|
| [ SQL 연습 ] 식품분류별 가장 비싼 식품의 정보 조회하기 (1) | 2024.12.09 |
| [ SQL 연습 ] 저자 별 카테고리 별 매출액 집계하기 (1) | 2024.12.04 |
| [ SQL 연습 ] 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (1) | 2024.11.15 |
| [ SQL 연습 ] 조건에 부합하는 중고거래 댓글 조회하기. (0) | 2024.11.13 |