이번에는 DB 이상 현상에 대해 정리해보겠습니다.
DB 이상 현상이란?
이상 현상(Anomaly)란 현실 세계의 실제 값과 데이터베이스에 저장된 값이 일치하지 않는 문제입니다. 데이터를 부적절하게 저장하거나 관리할 때 발생하는 문제점들로 주로 정규화를 제대로 수행하지 않을 때 발생합니다. 정규화를 제대로 수행하지 않으면 중복이 발생하고 일관성과 무결성이 깨지기 때문입니다. (이상 현상은 정규화를 통해 해결할 수 있습니다.)
이상 현상은 삽입 이상, 갱신 이상, 삭제 이상 세 가지 유형이 존재합니다. DB에 데이터를 변경하는 작업에서 발생합니다. 아래는 설명을 도와주기 위한 예시 테이블입니다.
학번 | 학생 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 김길동 | 101 | Spring | 김일한 |
2 | 고길동 | 101 | Spring | 김일한 |
3 | 이길동 | 102 | JPA | 이도영 |
4 | 주길동 | 102 | JPA | 이도영 |
5 | 박길동 | 103 | MSA | 장문수 |
삽입 이상(Insertion Anomaly)
삽입 이상이란 필요한 데이터를 DB에 삽입하지 못하거나 불필요한 데이터가 삽입되는 경우를 말합니다.
위의 테이블에서 학생 데이터를 입력하고자 합니다. 학번, 학생 이름만 입력하면 되는데 강의에 관련된 데이터까지 입력해야 하네요. 필요 이상의 정보를 입력해야 하는 상황입니다. 반대로 강의 데이터를 입력하려 하면 수강 중인 학생의 데이터도 입력을 해야 합니다. 이런 경우, 아직 학생들이 수강 신청하기 전이면 강의를 등록할 수가 없습니다.
이처럼 필요 이상의 정보를 입력 해야 하거나 필요한 정보를 등록할 수 없는 것이 삽입 이상입니다.
학생 정보를 입력한 경우
학번 | 학생 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 김길동 | 101 | Spring | 김일한 |
2 | 고길동 | 101 | Spring | 김일한 |
3 | 이길동 | 102 | JPA | 이도영 |
4 | 주길동 | 102 | JPA | 이도영 |
5 | 박길동 | 103 | MSA | 장문수 |
6 | 정길동 |
강의 정보가 비어버린다. 추가적인 강의 정보 입력을 요구하게 된다.
강의 정보를 입력한 경우
학번 | 학생 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 김길동 | 101 | Spring | 김일한 |
2 | 고길동 | 101 | Spring | 김일한 |
3 | 이길동 | 102 | JPA | 이도영 |
4 | 주길동 | 102 | JPA | 이도영 |
5 | 박길동 | 103 | MSA | 장문수 |
104 | 운영체제 | 노마드 |
학생 정보가 비어있어 이 데이터는 삽입될 수 없다. 강의 데이터만으로는 삽입할 수가 없다.
갱신 이상(Update Anomaly)
데이터가 변경되었을 때 불일치가 발생되거나 너무 많은 곳에서 갱신해야 하는 번거로움이 발생한 경우를 말합니다.
Spring 강의를 학생 100명이 수강하고 있다고 가정해 봅시다. 이 때, 담당 교수님이 김일한에서 김이한으로 교체되었습니다. 그러면 100명의 레코드에 대해 데이터를 업데이트하는 과정을 거쳐야 합니다. 또한 다른 테이블에서 Spring 강의 정보를 가지고 있다면 불일치가 발생하게 됩니다.
이처럼 데이터를 갱신했을 때 불일치가 발생하거나 너무 많은 곳에서 갱신해야 하는 작업이 생기는 것은 갱신 이상이라 합니다.
학번 | 학생 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 김길동 | 101 | Spring | 김이한 |
2 | 고길동 | 101 | Spring | 김이한 |
… | … | … | … | … |
… | … | … | … | … |
99 | 마길동 | 101 | Spring | 김이한 |
100 | 유길동 | 101 | Spring | 김이한 |
100개의 레코드에 정보를 모두 담당 교수를 김이한으로 교체해야 합니다. 이는 연산 횟수를 늘려 비효율적입니다.
강의실 번호 | 강의장 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 101 강의장 | 101 | Spring | 김일한 |
2 | 102 강의장 | 101 | Spring | 김일한 |
위의 테이블은 강의실과 강의에 대한 데이터를 저장하는 다른 테이블입니다.
이 테이블에 갱신 작업을 하지 않으면 테이블 간의 데이터가 불일치하는 경우가 생깁니다.
삭제 이상(Deletion Anomaly)
한 데이터를 삭제하면 원하지 않던 다른 데이터까지 함께 삭제되는 경우입니다.
예시 테이블에서는 학생 테이블을 삭제하면 강의 정보도 함께 삭제되는 것이 예시입니다.
학번 | 학생 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 김길동 | 101 | Spring | 김일한 |
2 | 고길동 | 101 | Spring | 김일한 |
3 | 이길동 | 102 | JPA | 이도영 |
4 | 주길동 | 102 | JPA | 이도영 |
5 | 박길동 | 103 | MSA | 장문수 |
원본 테이블에서 박길동에 대한 학생 정보를 삭제하면 MSA 강의 정보도 함께 삭제됩니다.
학번 | 학생 이름 | 강의코드 | 강의 이름 | 담당 교수 |
1 | 김길동 | 101 | Spring | 김일한 |
2 | 고길동 | 101 | Spring | 김일한 |
3 | 이길동 | 102 | JPA | 이도영 |
4 | 주길동 | 102 | JPA | 이도영 |
사라저버린 MSA 강의 정보...
마무리
이번에는 DB 이상 현상에 대해 정리했습니다.
DB 이상 현상은 삽입 이상, 갱신 이상, 삭제 이상 3가지 유형이 있습니다.
삽입 이상은 데이터를 삽입할 때 원치 않은 데이터까지 추가로 입력해야 하거나 필요한 정보를 저장할 수 없는 경우에 발생합니다. 즉 사용자가 원하는 데이터 형식에 딱 맞게 저장할 수 없을 때 발생합니다.
갱신 이상은 하나의 데이터가 업데이트 되면 불일치가 발생하거나 너무 많은 곳에서 데이터를 업데이트 해야 하는 번거로움이 생기는 경우를 말합니다.
삭제 이상은 데이터를 삭제했을 때 원하지 않던 데이터까지 함께 삭제되는 경우를 말합니다.
이 DB 이상 현상은 정규화를 제대로 수행하지 않을 경우 발생합니다. 즉, 정규화를 제대로 수행하면 이상 현상을 해결할 수 있습니다. 예시 테이블에서도 학생과 강의로 테이블을 나누면 대부분의 문제는 해결이 됩니다.
오늘은 여기까지 하겠습니다.
감사합니다.