본문 바로가기

MySql

MySQL(07.16) - 데이터 정규화, 트랜잭션

데이터 정규화

  • 데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정
  • 정규화 사용은 데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을 보장하기 위함이다.
  • 필수적으로 하지 않아도 되지만, 장점이 큰데 사용하지 않을 이유 없다.

정규화 거치지 않을 시 발생할 수 있는 이상 종류

1. 삽입 이상

  • 데이터 삽입 시 의도와 다른 값도 삽입

2. 삭제 이상

  • 데이터 삭제 시 의도와 다른 값들도 연쇄 삭제

3. 갱신 이상

  • 속성값 갱신 시 일부 튜플만 갱신되어 모순 발생

제1 정규화

  • 한 칸에 데이터 1개
  • 각 컬럼은 하나의 데이터만 저장하며, 다중 값을 갖지 않는다.

제1 정규화 적용 전

학생번호 학생이름 수강과목
20240001 김철수 자바
20240002 김영희 C언어
20240003 홍길동 C언어, 파이썬
  • 데이터의 중복 발생이 가능
  • 데이터의 수정, 삭제, 삽입 연산에 이상 문제가 있을 수 있다.

발생할 수 있는 이상현상

  1. 갱신 이상
    홍길동의 C언어를 다른 과목으로 바꿀 경우 김영희가 듣고 있는 C언어 과목도 바뀔 가능성
  2. 삭제 이상
    홍길동의 C언어 과목만 수강 취소 할 경우 김영희가 듣고 있는 C언어 과목도 취소될 가능성

제1 정규화 적용 후

학생번호 학생이름 수강과목
20240001 김철수 자바
20240002 김영희 C언어
20240003 홍길동 C언어
20240003 홍길동 파이썬

 

  • 데이터의 중복 크게 줄어들고 공간적 효율성이 향상

제2 정규화

  • 현재 테이블과 주제가 맞지 않는 컬럼은 다른 테이블로 이동

제2 정규화 적용 전

학생번호 학생이름 수강과목 가격 수강완료
20240001 김철수 자바 300,000 0
20240002 김영희 C언어 400,000 1
20240003 홍길동 C언어 400,000 0
20240003 홍길동 파이썬 350,000 1

 

발생할 수 있는 이상 현상

  1. 삽입 이상
  • 학생 중 또 다른 수강 과목을 등록한다면 구조상 학생과 연관된 컬럼도 채워야 하는 문제가 발생, 원하는 정보만 추가할 수 없는 것
  1. 수정 이상, 삭제 이상
  • 수정 또는 삭제 했을 시 학생 관련 정보가 일부만 수정되거나 원하지 않는 정보까지 삭제되는 문제가 발생

제2 정규화 적용 후

<수강생 등록 현황 table>

학생번호 학생이름 수강과목 수강완료
20240001 김철수 자바 0
20240002 김영희 C언어 1
20240003 홍길동 C언어 0
20240003 홍길동 파이썬 1

 

<과목 table>

수강과목 가격
자바 300,000
C언어 400,000
파이썬 350,000

 

  • 중복이 줄어들고, 데이터 무결성이 유지된다.
  • 전체적인 데이터 관리 및 유지 보수가 향상된다.

제3 정규화

  • 일반 컬럼에만 종속한 다른 컬럼을 다른 테이블로 이동
수강과목 가격 강사 출신대학
자바 300,000 김철수 a
C언어 400,000 김영희 b
파이썬 350,000 박영수 c
DBMS 400,000 박영수 c
프론트엔드 500,000 김철수 a

 

삽입, 수정, 삭제 이상

 

<과목 table>

수강과목 가격 강사
자바 300,000 김철수
C언어 400,000 김영희
파이썬 350,000 박영수
DBMS 400,000 박영수
프론트엔드 500,000 김철수

 

<강사 table>

강사 출신대학
김철수 a
김영희 b
박영수 c

 

  • 각 테이블은 원자적인 값을 가지게 되고 데이터 중복이 줄어든다.
  • 이상 현상을 피할 수 있으며 유지 보수가 훨씬 용이해진다.

비정규화

  • 정규형을 지키면 이상 현상을 방지할 수 있고, 테이블의 구조를 수정하고 이해하기 편하다는 장점이 있지만 테이블이 나뉘어 있기 때문에 속도가 느리고, 성능이 저하될 수 있다.

이럴 경우 다시 정규형을 지키지 않는 테이블로 만드는 것

 


트랜잭션(transaction)

  • 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위
Start transaction
.
.

Rollback -> start transaction 부분으로 작업 되돌리기
.
.
Commit -> 문제 없을 경우, 사용하면 다시 rollback 해도 그 상태 그대로