💡 핵심 인사이트
이상 현상(Anomaly)은 데이터베이스 설계 시 테이블을 너무 뚱뚱하게 하나로 합쳐놔서(정규화 실패), 데이터가 쓸데없이 '중복' 저장됨으로써 발생하는 데이터 입력, 수정, 삭제 시의 치명적인 오류와 불일치 현상을 말합니다.
관계형 DB의 최대 적인 이 이상 현상을 치료하는 수술 과정이 바로 다음 장에 배울 **'정규화(Normalization)'**입니다.


Ⅰ. 이상 현상이 터지는 뚱뚱한 테이블의 구조

설계 초보자가 엑셀 쓰듯이 모든 정보를 하나의 거대한 테이블로 짰다고 가정합시다.

  • 수강 테이블: (학번, 이름, 학과, 과목명, 성적)
학번이름학과과목명성적
101김철수컴퓨터DBA
101김철수컴퓨터OSB
102이영희경영회계A

김철수가 과목을 2개 듣는 바람에 이름(김철수)학과(컴퓨터)라는 정보가 2번 중복해서 기록되었습니다. 단순히 용량이 낭비되는 게 문제가 아닙니다. 이 '중복'이라는 암세포는 삽입, 삭제, 갱신이라는 3가지 끔찍한 부작용(이상 현상)을 몰고 옵니다.


Ⅱ. 3대 이상 현상 (삽입 / 삭제 / 갱신 이상)

1. 삽입 이상 (Insertion Anomaly)

  • 정의: "내가 넣고 싶은 데이터만 넣을 수 없고, 굳이 안 넣어도 되는 불필요한 데이터까지 강제로 억지로 끼워 넣어야만 DB에 입력되는 현상"
  • 사태 발생: 신입생 '박민수(컴퓨터)'가 입학했습니다. 아직 학기 초라 수강 신청한 과목이 하나도 없습니다. 이 뚱뚱한 테이블에 민수를 넣으려니, 기본키 일부인 과목명 칸에 넣을 값이 없습니다. PK는 NULL이 될 수 없으므로 DB가 에러를 뱉으며 민수의 입학 자체를 거부해 버립니다.
  • 원인: 학생 정보와 수강 정보가 한 테이블에 묶여 있기 때문입니다.

2. 삭제 이상 (Deletion Anomaly)

  • 정의: "내가 지우고 싶은 데이터만 지우려 했는데, 연쇄 폭발이 일어나 전혀 지울 의도가 없었던 핵심 정보(진짜 필요한 데이터)까지 통째로 날아가는 연쇄 유실 현상"
  • 사태 발생: 이영희 학생이 자퇴는 아니고, '회계' 과목 수강만 취소(Drop)하고 싶어 102번 행을 DELETE 날렸습니다.
  • 그런데 그 한 줄이 날아가면서, 억울하게도 "이영희는 경영학과 학생이다"라는 학교에 꼭 남겨둬야 할 학생 신상 정보마저 우주에서 영원히 삭제되어 버립니다. (데이터의 고아화).

3. 갱신 이상 (Update Anomaly)

  • 정의: "중복된 데이터 중 일부만 수정되고 나머지는 옛날 값 그대로 남아있어서, 어떤 것이 진짜 정답인지 모순(데이터 불일치)이 발생하는 현상"
  • 사태 발생: 김철수가 컴퓨터학과에서 '수학과'로 전과를 했습니다. DB 관리자가 101번 김철수의 학과를 '수학과'로 업데이트(UPDATE) 해야 합니다. 그런데 김철수 데이터가 2줄(DB, OS)이나 있습니다.
  • 관리자가 실수로 DB 과목 줄의 학과만 '수학과'로 고치고, OS 과목 줄은 깜빡하고 '컴퓨터'로 놔뒀습니다.
  • 나중에 쿼리를 치면 김철수의 학과가 수학과인지 컴퓨터인지 DB 스스로 모순에 빠져 멘붕이 옵니다.

📢 섹션 요약 비유: 뚱뚱한 테이블은 샴쌍둥이처럼 **'환자 두 명(학생과 수강)을 한 침대에 억지로 본드로 묶어놓은 상태'**입니다. 한 명에게 주사(삽입)를 놓으려 해도 옆 사람이 없으면 안 되고, 한 명이 퇴원(삭제)하려 하면 멀쩡한 옆 사람 다리까지 같이 잘려 나가며, 한 명에게 약을 바를 때(갱신) 꼼꼼히 다 발라주지 않으면 피부색이 짝짝이가 되는 무서운 부작용(이상 현상)이 터집니다. 침대를 두 개로 찢어 분리(정규화)하는 것만이 살길입니다.