티스토리 뷰

개발공부/🧺 DBMS

[DB] 데이터 모델링

2022. 9. 19. 10:17

1️⃣  이상 현상과 정규화

 

이상 현상 (Anomaly)

 

잘못된 데이터베이스 설계로 발생하는 오류

 

-  삽입 이상  : 데이터를 삽입할 때 불필요한 내용까지 삽입해야 하는 문제

-  갱신 이상  :  중복된 데이터 중 일부만 갱신되어 발생하는 문제

-  삭제 이상  :  어떤 데이터를 삭제할 때 다른 유용한 정보도 함께 삭제되는 문제

 

 

ex)

주문을 하지 않은 고객의 데이터를 넣을 수 없는 문제  →  삽입 이상

'김민준' 고객의 주소를 수정하려면 모든 튜플에서 갱신해야 하는 문제  →  갱신 이상

'이서연' 회원의 주문 기록을 지우려면 회원의 데이터가 함께 삭제되는 문제  →  삭제 이상

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

함수 종속성

 

속성들 간의 종속 관계

 

어떤 속성 X의 한 값이 다른 속성 Y에 속한 하나의 값에만 매핑되는 경우를 말한다.

여기서 X를 결정자, Y를 종속자라고 한다.

 

-  완전 함수 종속, 부분 함수 종속, 이행 함수 종속 등이 있다.

-  함수 종속성에 대해 알아야 이상 현상을 제거하기 위한 정규화를 이해할 수 있다.

 

 

 

 

정규화 (Normalization)

 

이상 현상을 제거하기 위해 데이터베이스를 구조화하는 과정

 

-  데이터 간의 종속성을 제거하여 중복되는 데이터를 줄일 수 있다.

-  데이터의 일관성과 무결성을 보장한다.

-  1차 정규화, 2차 정규화, 3차 정규화, 보이스코드 정규화, 4차 정규화, 5차 정규화가 있다.

 

 

 

 

 

 

2️⃣  1차 정규화

 

💡  정규화를 하기 전에

ERD를 통해 최종 형태의 데이터베이스를 설계하는 것이 아니라 지속해서 변경해 나가야 한다.

 

 

 

이상현상

 

대여 시간에 2개의 시간이 같이 들어있다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

정규화

 

한 속성 값에 두 개가 입력된 대여 시간을 분해한다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

→  1차 정규화 (1NF)  :  테이블의 컬럼이 하나의 값만 갖도록 도메인을 원자값으로 설정하는 과정

 

 

💡 용어 해설

원자값  :  더 이상 나눌 수 없는 가장 작은 값

 

 

 

 

 

 

 

3️⃣  2차 정규화

 

이상현상

 

한 번도 대여를 하지 않은 고객을 삽입할 수 없다. (삽입 이상)

하나의 튜플에서만 김민준 고객의 이름을 변경하면 데이터의 불일치가 발생한다. (갱신 이상)

willgo 브랜드에서 대여한 기록을 삭제하면 이서연 고객의 데이터가 완전히 사라진다. (삭제 이상)

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

이상현상의 원인

 

위 데이터베이스에서 기본키는 복합키로 고객 ID와 대여 시간이다.

기본키는 결정자, 나머지는 기본키에 대한 종속자이다.

 

여기서, 고객이름은 대여시간과 관계 없이 고객 ID만으로 결정된다.

→  부분 함수 종속

 

반면, 나머지(대여장소, 브랜드명, ...)는 고객ID와 대여시간을 함께 알아야지만 결정이 된다.

→  완전 함수 종속

 

 

💡  부분 함수 종속

:  기본키를 구성하는 속성 중 일부가 결정자 역할을 하는 경우

-  기본키가 복합키이거나 후보키가 결정자인 경우에 부분 함수 종속이 발생할 수 있다.

-  반대로 기본키를 구성하는 속성 모두가 결정자 역할을 하는 경우 완전 함수 종속이라고 한다.

 

 

 

 

정규화

 

고객 테이블과 대여 테이블로 분리하여 부분 함수 종속을 제거한다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

→  2차 정규화 (2NF)  :  부분 함수 종속을 제거하고 완전 함수 종속이 되도록 테이블을 분해하는 과정

 

 

 

 

 

 

4️⃣  3차 정규화

 

이상현상

 

고객이나 대여 이력이 없는 경우 새로운 회사가 만든 브랜드를 삽입할 수 없다. (삽입 이상)

elice 회사의 브랜드명이 변경되는 경우 데이터의 불일치가 발생한다. (갱신 이상)

flykite 고객의 대여 기록을 삭제하면 everythere 회사의 데이터가 완전히 사라진다. (삭제 이상)

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

이상현상의 원인

 

기본키는 복합키로 고객 ID와 대여 시간이다.

킥보드는 이용 1분에 대한 가격에 대한 정보를 브랜드를 출시한 회사가 결정한다.

브랜드와 연식에 따라 킥보드의 기본료가 다르다.

 

고객 ID와 대여 시간(기본키)을 알면 브랜드명을 알 수 있고, 브랜드명을 알면 회사명을 알 수 있다.

→  이행 함수 종속

 

 

💡  이행 함수 종속

X → Y, Y → Z라는 종속 관계가 있을 때 X → Z가 성립하는 경우

(즉 X라는 속성을 통해 Y를 알고, Y라는 속성을 통해 Z라는 속성을 알 수 있는 경우)

 

 

 

 

정규화

 

step1)  대여 테이블과 회사 테이블로 분해하여 이행 함수 종속을 제거한다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

step2)  대여 테이블과 가격 테이블을 분해하여 이행 함수 종속을 제거

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

→  3차 정규화 (3NF)  :  이행 함수 종속을 제거하도록 테이블을 분해하는 과정

 

 

 

 

 

 

 

5️⃣  정규화 정리

 

 

정규화 과정

 

대부분 3차 정규화를 진행하면 대부분 이상 현상이 제거된다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

3차 정규화 이후에도 이상현상이 남아있다면, BDNF  →  4차 정규화  →  5차 정규화를 진행한다.

하지만 4차, 5차 정규화까지 진행하는 일은 드물다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

 

BCNF

 

결정자이면서 후보키가 아닌 것을 제거하는 과정

 

ex)

학생은 여러 과목을 수강할 수 있고 교수는 한 과목만 가르친다.

 

교수는 가르칠 학번(학생)을 결정할 수는 없다.

→  교수는 과목을 결정하는 결정자이지만 후보키는 아니다.

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

 

4차 정규화

 

다치 종속을 제거하는 과정

 

ex)

하나의 과목은 여러 교수가 가르치며 여러 공통 교재가 사용된다.

 

한 과목의 교수를 새로 등록하기 위해서는 교재별로 튜플을 만들어야 하므로 교수가 중복 등록된다.

→  다치 종속

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

 

5차 정규화

 

조인 종속을 제거하는 과정

 

ex)

하나의 수업은 여러 교수가 가르치며 학생은 같은 수업의 다른 교수 수업을 수강할 수 있다.

 

수업 테이블을 분해했다가 다시 합쳤을 때(조인) 불필요한 튜플이 발생한다.

→  조인 종속

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

역정규화 (반정규화)

 

정규화된 데이터베이스의 성능을 개선하기 위해 다시 통합하여 구조를 재구성

 

정규화를 통해 테이블을 분해하면 여러 테이블을 조인할 때 성능이 크게 떨어질 수 있다.

따라서 자주 사용되는 쿼리를 고려하여 데이터 중복을 감안해 역정규화를 하는 것이 효율적일 수 있다.

 

 

 

 

 

 

 

6️⃣  DB 완성해보기 (공유 킥보드 DB 예제)

 

1. 고객 테이블

 

-  기본키를 회원의 ID 대신 고유 번호로 설정

-  비밀번호는 값을 그대로 넣으면 보안에 취약하므로 hash를 사용

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

2. 대여 테이블

 

-  고객 번호를 외래키로 사용

-  대여 장소보다 정확하게 위도와 경도 데이터를 입력 받음

-  대여 상태를 입력 받아 킥보드를 대여하는 것인지 반납하는 것인지 기록

-  브랜드명과 연식을 함께 외래키로 사용하는 대신 킥보드 ID를 생성하여 외래키로 사용

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

3. 킥보드 테이블

 

-  킥보드 ID를 기본키로 사용하고 테이블 명을 킥보드로 설정

-  브랜드 이름 대신 브랜드 고유 번호를 생성하여 외래키로 사용

-  가격을 계산하는 쿼리가 많이 사용되어 분당 가격 컬럼을 킥보드 테이블에 입력

(기본료나 분당 가격이 변경되는 경우 데이터 불일치 현상이 일어날 수 있지만 기본료나 분당 가격이 변경되는 경우는 적기 때문에

데이터 불일치를 감안하더라도 하나의 테이블에 묶어서 쿼리의 성능을 올리는게 좋겠다고 판단)

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

 

4. 브랜드 테이블

 

-  브랜드 번호를 기본키로 사용하고 테이블 명을 브랜드로 설정

-  킥보드가 없더라도 새로운 브랜드를 등록 가능

 

이미지출처 : 엘리스 데이터베이스 기초 - 3장 데이터 모델링 강의자료

 

 

 

 

 

ERD

.

 

 

 

 


 이 글은 엘리스의 AI트랙 5기 강의를 들으며 정리한 내용입니다.

반응형

'개발공부 > 🧺 DBMS' 카테고리의 다른 글

[DB] 데이터베이스 구성하기  (0) 2022.09.17
[DB] 데이터베이스란 무엇인가?  (0) 2022.09.16
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그