데이터베이스 정규화가 필요한 이유?
데이터베이스를 설계하면서 요구사항을 분석하고, 개념적, 논리적 설계를 통해 릴레이션을 모델링한다
아무리 꼼꼼하게 설계를 진행해도 실제 사용하면서 발생하는 문제를 예측하기 어려운 경우도 있다
DDL, DML을 작성해 복잡한 쿼리, 테스트를 진행하다 보면 문제가 있는 부분을 발견하고 테이블을 분리하거나 합치는 등 수정이 필요하다
이러한 상황에서 어떤 기준을 가지고 테이블을 수정할 수 있을까?
잘못된 설계를 어떻게 파악하는지? 올바른 설계가 무엇일까? 모든 상황에 적합한 설계가 존재할까?라는 생각을 할 수 있다
이러한 이유로 데이터베이스 설계 과정에서 데이터의 중복, 일관성, 무결성 문제, 공간 낭비 등을 해결하기 위해 데이터베이스 정규화 과정이 필요한 것이라고 할 수 있을 것 같습니다
데이터베이스 정규화란?
- 이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정
- 이상현상이 있는 릴레이션은 이상현상을 일으키는 함수 종속성의 유형에 따라 등급을 구분
- 릴레이션은 정규형 개념으로 구분하며, 정규형이 높을수록 이상현상은 줄어듦
위에서 데이터베이스의 데이터 중복을 해결하고, 무결성, 공간 낭비의 문제를 해결하기 위해 정규화가 필요하다고 하였다
데이터베이스 정규화의 개념을 보면
이상현상과 함수 종속성을 언급하면서 이상현상을 없애고 함수 종속성을 분리해야 한다고 한다
이상현상
- 삭제 이상: 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
- 삽입 이상: 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
- 갱신 이상: 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상
삭제 이상이란
학생번호 402인 장미란을 삭제하면 강의실 체육관103에 대한 정보도 같이 사라져 버린다
삽입 이상이란
새로운 학생에 대한 데이터를 삽입하고 싶을 때 수강하고 싶은 강좌에 대한 정보가 없다면(개설이 되지 않거나) NULL을 입력해야 한다
수정 이상이란
박지성 학생의 자료구조 강의실이 공학관 112호로 변경된다면 추신수 학생은 같은 수업임에도 강의실이 다른 상태로 저장된다
이러한 이상현상은 서로 공유하는 데이터임에도 불구하고 각자의 튜플에 독립적으로 존재하기 때문에 발생합니다. 그러므로 테이블을 분리하여 그 테이블을 통해 강의 제목이나 강의실을 참고하게끔 한다면 이상현상들을 해결할 수 있습니다
-> 잘못된 테이블 설계가 이루어지면 이상현상이 발생하며 이러한 이상현상을 해결하기 위한 방법이 정규화가 된다
함수 종속성
- 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 종속성이라 함
- A->B로 표기하며 A를 B의 결정자라고 함
마찬가지로 예시로 이해해 보면 좋다
- 학생번호->학생이름처럼 A->B로 표현하며 A가 B를 결정한다고 하여 A를 B의 결정자라고 한다
- 마찬가지로 강좌이름 -> 강의실과 같은 종속관계가 있음을 볼 수 있다
- 종속하지 않는 관계로는 학과 -> 학생번호, 학생이름 -> 강좌이름이 있다
- 학생이름 -> 학과는 종속하는 것처럼 보이지만 동명이인의 학생이 있는 경우 그 학생의 이름은 학과를 결정하지 못하므로 종속의 관계가 아니다!
함수의 종속성을 정확하게 파악하지 않고 데이터베이스를 설계하면 이상현상이 발생할 수 있게 되는 것
정규화
제 1정규화
- 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것
여러 개의 취미를 가진 고객들이 존재한다 컬럼이 원자값을 갖지 않고 다중 값을 가질 수 있다면 어떤 이상현상들이 발생할까?
- 삽입 이상
- 취미가 여러 개이기 때문에 여러 개를 입력했으나 일부 취미만 삽입되는 경우가 발생할 수 있음
- 갱신 이상
- 취미를 변경하였는데 일부만 변경되고 변경되지 않은 취미가 존재하는 경우
- 삭제 이상
- 마찬가지로 삭제할 때에도 삭제할 취미와 삭제하지 말아야 할 취미가 같이 삭제되는 경우가 발생할 수 있다
제 2정규화
- 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
- 완전 함수 종속
- 기본키의 부분 집합이 결정자가 되지 않도록 하는 것
이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다
- (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있다 / (학생번호, 강좌이름) --> (성적)
여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다 / (강좌이름) --> (강의실)
즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우
기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다
그렇다면 제 2정규형을 만족하지 못할 때 나타날 수 있는 이상현상은 무엇이 있을까?
- 갱신 이상
- 기본키가 복합키를 이루고 있다 특히 강좌이름의 경우 여러 튜플에서 저장하고 있는데 강좌이름을 변경할 때 중복된 데이터 중 일부만 갱신될 수 있음
- 삭제 이상
- 중복된 데이터가 있다는 것은 하나의 데이터를 삭제하고 싶은데 중복된 데이터까지 같이 삭제될 수 있음
이러한 이상현상을 방지하기 위해 테이블을 결정자가 되는 부분키와 데이터를 다른 테이블로 분리해야 한다
제 3정규화
- 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
- 이행적 종속
- 이행 규칙 : If X -> Y and Y -> Z then, X -> Z
- A -> B, B -> C가 성립할 때 A -> C가 성립되는 것
- 학생 번호는 강좌 이름을 결정
- 강좌 이름은 수강료를 결정
- 학생 번호로 수강료를 결정할 수 있게 됨
만약 학생번호 501의 강좌이름을 변경한다면?
-> 수강료도 같이 변경됨 -> 수정 이상이 발생할 수 있음
- 갱신 이상
- 학생번호에 해당하는 강좌이름을 변경할 때 수강료도 같이 변경되어야 하며 변경되지 않아 갱신 이상이 발생할 수 있음
- 삭제 이상
- 학생번호로 데이터를 삭제하면 강좌에 해당하는 수강료 정보까지 삭제되어 버림
- 삽입 이상
- 학생 번호에 해당하는 강좌이름을 삽입할 때 수강료가 빠질 수 있음
수강료 테이블을 분리하면서 학생이 강좌 수강을 추가, 삭제, 수정하여도 수강료에 이상이 생기는 일이 없어짐
BCNF 정규화
- 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
- 모든 결정자가 후보 키에 대해 완전 함수적 종속을 가져야 한다
- 특강수강 테이블에서 기본키는 (학생번호, 특강이름) --> 교수
- 교수 --> 특강이름
문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키(유일성과 최소성을 만족)가 아니라는 점이다
결정자 중 일부가 다른 결정자에 종속적인 경우 어떤 이상현상이 발생할 수 있을까?
- 삽입 이상
- 학생번호, 특강이름을 삽입하는데 교수가 제대로 삽입되지 않을 수 있다
- 갱신 이상
- 특강이름을 갱신하면서 교수도 갱신해야 하는데, 제대로 갱신되지 않을 수 있다
- 삭제 이상
- 학생, 특강을 삭제하는데 교수가 같이 삭제되면서 교수에 대한 정보까지 삭제될 수 있다
BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 하는데, 다음과 같이 특강신청 테이블과 특강교수 테이블로 분해할 수 있다
제4, 5정규화는 고급 정규화과정으로 생략하였습니다
왜 제 4, 5 정규화는 많이 사용되지 않는가?
- 부분의 릴레이션에서는 BCNF까지 정규화하면 실제적인 이상현상이 없어지기 때문에 BCNF까지 정규화를 한다고 합니다
정리
이상현상을 최대한 발생시키지 않기 위해 테이블을 계속 분리하였다
하지만 정규화를 BCNF 정규형까지 정규화하는 것이 항상 옳을까?
테이블을 분리한다는 것은 우리가 원하는 데이터를 수집하기 위해서는 여러 테이블을 참고하여 데이터를 합쳐야 한다
즉 비용이 큰 Join 연산을 많이 해야 한다는 것이다
항상 성능과 비용은 트레이드오프다 성능을 올리면 그에 따른 비용이 필요하다
쿼리 성능을 올리기 위해 이상현상에 대응, 데이터 중복 비용에 대응해야 하는 비용이 필요하다
데이터의 무결성을 생각하며 정규형을 열심히 진행했는데 성능이 안 나온다면 다시 테이블을 합치는 것을 고민해봐야 한다
이러한 작업을 반정규화라고 하며 이어서 다음 글에서 정리해 보자
질문
- 정규화에 대해 설명해 주세요
- 정규화란 이상현상이 존재하는 릴레이션을 분해하여 이상현상을 없애는 과정이다
- 이상현상을 일으키는 함수 종속성의 단계에 따라 정규형 등급을 결정한다
- 이상현상이란?
- 이상현상이란 데이터를 삭제, 갱신, 삽입했을 때 데이터의 불일치 혹은
- 삭제이상은 데이터를 삭제했을 때 다른 데이터까지 같이 삭제되어 데이터가 사라지는 이상현상이다
- 갱신이상은 데이터를 갱신했을 때 중복되는 데이터 중 일부만 갱신되는 이상현상
- 삽입이상은 데이터를 삽입할 때 특정 데이터가 NULL이 되어 들어가는 이상현상
- 함수 종속성이란?
- 함수 종속성이란 컬럼이 A, B가 있을 때 A의 값이 B의 값을 결정짓는 관계에 있는 것을 말한다
- 예를 들어 내 주민번호를 통해 내 이름을 알아낼 수 있듯 주민번호가 A 컬럼 이름이 B컬럼이면 A를 통해 B를 결정짓는다
- 제1 ~ BCNF 정규형까지 설명해 주세요
- 제 1정규형은 컬럼이 원자값만 갖도록 하는 것을 말한다
- 제 2정규형은 완전 함수적 종속을 만족하도록 테이블을 분해하는 것을 말한다
- 완전 함수적 종속이란 기본키의 부분집합이 결정자가 되지 않는 것을 말한다
- 제 3정규형은 이행 함수적 종속을 없애도록 테이블을 분해하는 것을 말한다
- 이행 함수적 종속이란 컬럼 A, B, C가 있을 때 A -> B이고 B -> C 이면 A -> C인 함수적 종속 관계가 존재하는 것을 말한다
- BCNF 정규형은 모든 결정자가 후보키가 되도록 테이블을 분해하는 것을 말하며 후보키인 결정자는 완전 함수적 종속이어야 한다
Reference
https://mangkyu.tistory.com/110
[Database] 정규화(Normalization) 쉽게 이해하기
지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz
mangkyu.tistory.com
https://velog.io/@coastby/DB-DB-%EC%84%A4%EA%B3%84-%EA%B3%BC%EC%A0%95
[DB] DB 설계 과정
DB 설계 순서1️⃣ 요구사항 수집 분석실제 세계에서 어떤 시스템을 구축할 것인지에 대한 요구사항 수집요구사항에 대해 어떤 데이터들이 필요한지, 어떤 기능들이 필요한지 분석2️⃣ 개념
velog.io
[Database] 정규화가 필요한 이유, 정규화
데이터베이스를 잘못 설계하면 불필요한 데이터 중복으로 발생하는 공간낭비 및 부작용을 초래할 수 있습니다. 이러한 부작용을 이상(Anomaly) 이라고 하는데, 이상 현상의 종류로 삽입이상, 갱신
velog.io
'데이터베이스' 카테고리의 다른 글
트랜잭션 (0) | 2023.09.07 |
---|---|
데이터베이스 반정규화 (1) | 2023.09.06 |
데이터베이스 커넥션 풀 (0) | 2023.09.05 |
MySQL 인덱스 동작 확인하기 (0) | 2023.07.23 |
조회 성능 최적화를 위한 인덱스 (2) (1) | 2023.07.06 |