테이블 설계
테이블 설계는 업무 데이터를 어떤 단위로 저장하고, 어떤 기준으로 이력을 남기며, 장애가 났을 때 어디서 추적할지 정하는 작업이다. 유통 시스템은 주문 한 건이 재고, 출고, 배송, 반품, 정산, 외부 연동까지 이어지기 때문에 테이블을 너무 크게 합치면 변경과 추적이 어려워진다.
실무 팁
조회가 편하다는 이유로 하나의 테이블에 모든 상태와 수량을 넣으면 초기 개발은 빠르지만, 부분 출고와 반품이 들어오는 순간 수정 비용이 커진다. 현재 상태 테이블과 이력 테이블을 분리하는 습관이 중요하다.
개념 정의
유통 시스템 테이블은 보통 다음 기준으로 나눈다.
| 구분 | 설명 | 예시 |
|---|---|---|
| 기준정보 | 상품, 거래처, 창고, 로케이션처럼 업무의 기준이 되는 데이터 | products, partners, warehouses |
| 업무 문서 | 주문서, 출고서, 반품서처럼 업무 단위를 표현하는 데이터 | orders, outbound_orders, returns |
| 라인 데이터 | 상품별 수량과 금액을 가진 상세 행 | order_lines, outbound_lines |
| 이력 데이터 | 상태 변경, 재고 증감, 인터페이스 처리 이력 | status_history, stock_ledger |
| 연동 데이터 | 외부 시스템 송수신 메시지와 처리 결과 | interface_messages, api_request_logs |
전체 구조 예시
이 ERD는 실제 시스템의 축약 예시다. 중요한 점은 주문, 출고, 배송, 반품을 한 테이블에 넣지 않고 각 도메인의 책임에 맞게 나눈다는 것이다.
실제 업무 흐름
- 주문이 접수되면
orders,order_lines가 생성된다. - 출고 요청이 만들어지면
outbound_orders,outbound_lines가 생성되고 원주문과 연결된다. - 피킹, 검수, 패킹 과정에서 출고 상태와 작업 이력이 쌓인다.
- 출고 확정 시
stock_ledger에 재고 차감 이력이 기록되고,stock_snapshots의 현재고가 갱신된다. - 배송 지시 후
deliveries에 송장과 배송 상태가 저장된다. - 반품이 들어오면
returns,return_lines,return_pickups