공통 원인
주문마다 고객 정보를 같이 저장하면
한 사실이 여러 행으로 퍼집니다.
이름, 주소, 전화번호가 주문 건수만큼 반복되면 고객 정보는 더 이상 한 곳에서 관리되지 않습니다.
주소를 바꿀 때도 주문 행 전체를 뒤져야 하므로, 같은 고객에 대해 서로 다른 값이 남기 쉽습니다.
핵심 문제
정규화 전 구조는 주문 사실과 고객 사실을 한 테이블에 섞어 둡니다.
정규화 전 주문 테이블 일부
| order_id |
customer_id |
이름 |
주소 |
| O-1001 |
C-120 |
김하늘 |
서울 강남구 101 |
| O-1048 |
C-120 |
김하늘 |
서울 서초구 55 |
| O-1092 |
C-120 |
김하늘 |
서울 강남구 101 |
이 중복은 운영에서 네 가지 비용으로 드러납니다
정합성
어느 주소가 현재 값인지 판별하기 어려워집니다.
10곳 중 1곳만 수정되면 같은 고객이 서로 다른 주소를 동시에 갖게 됩니다.
저장 공간
주문 100만 건이면 고객 정보도 100만 번 반복되어 저장됩니다.
고객 테이블을 분리하면 이름·주소·전화번호는 한 번만 저장하면 됩니다.
유지보수
컬럼 추가나 수정의 영향 범위가 흐려집니다.
주문 구조를 바꾸는 일인지, 고객 구조를 바꾸는 일인지 경계가 섞여 있기 때문입니다.
쿼리 의미
정규화는 JOIN을 늘리지만 의미는 더 단순해집니다.
각 테이블의 책임이 분명해져서 "무엇을 조회하는가"가 더 명확해집니다.
정규화의 실무 가치는 테이블을 잘게 쪼개는 데 있지 않습니다.
한 사실을 한 곳에서만 관리하게 만들어 변경, 조회, 운영 판단을 모두 더 안전하게 만드는 데 있습니다.