WMS의 기초가 되는 데이터베이스 설계(Database Schema Design)
WMS(Warehouse Management System, 창고관리시스템)
"어떤 물건이 어디에 있고, 어디로 가야 하는가?" 를 관리하는 시스템
창고 안으로 들어오는 물건(입고)과 나가는 물건(출고)의 정보를 체계적으로 관리
주요 기능
- 입고 / 출고 관리
- 재고 위치 최적화 (Slotting)
- 유통기한 관리
- 재고 실사
개발 관점에
바코드, RFID 등을 활용해 재고 정확도를 100%에 가깝게 유지하고, 동선을 효율화하는 로직이 중요
목표: 재고 가시성 확보및 물류 비용 절감
상품(Product) 테이블 설계
CREATE TABLE products (
prod_id INT AUTO_INCREMENT PRIMARY KEY, -- 숫자, 자동 증가 (1, 2, 3...)
barcode VARCHAR(50), -- 바코드 번호 (최대 50자)
prod_name VARCHAR(100) -- 상품명 (최대 100자)
);
🛡️ PRIMARY KEY (기본키) VS 💎 UNIQUE (고유키)
"중복을 허용하지 않는다"
|
PRIMARY KEY (기본키) |
UNIQUE (고유키) |
| 개수 |
테이블당 1개만 가능 |
여러 개 설정 가능 |
| NULL 허용 |
❌ Not Null |
✅ Null 허용 |
| 용도 |
행(Row)을 대표하는 식별자 |
아이디, 이메일, 전화번호 등 |
| 비유 |
조직의 유일무이한 두목 |
행동대장 |
📏 CHAR (고정 길이) VS 🌊 VARCHAR (가변 길이)
|
CHAR(10) |
VARCHAR(10) |
| 저장 방식 |
3글자 넣어도 10칸 전부 차지 (나머지는 공백) |
3글자 넣으면 3칸만 차지 |
| 공간 효율 |
낮음 (낭비 발생) |
높음 (알뜰살뜰) |
| 검색 속도 |
약간 더 빠름 |
크기 계산이 필요해 상대적으로 느림 |
| 용도 |
주민번호, 성별(M/F), 국가코드 |
이름, 주소, 게시글 제목 |
| WMS 예시 |
창고 구역 코드 (길이가 고정된 데이터) |
상품명 (길이가 제각각) |
길이가 항상 일정하면 CHAR, 길이가 들쭉날쭉하면 VARCHAR
재고(Inventory) 테이블 설계
CREATE TABLE inventory (
inv_id INT AUTO_INCREMENT PRIMARY KEY,
barcode VARCHAR(50),
quantity INT DEFAULT 0, -- 숫자로 지정하고 기본 값은 0
location_code VARCHAR(20), -- 창고 내 위치 (예: A-1-1)
FOREIGN KEY (barcode) REFERENCES products(barcode)
-- inventory의 barcode는 반드시 products 테이블에 존재해야 한다
);
⛓️ FOREIGN KEY와 데이터 무결성
FOREIGN KEY(외래키)는 부모-자식 관계를 통해 데이터 무결성을 보장
products 테이블 (부모)
└── inventory 테이블 (자식)
inventory에 barcode를 입력하려고 할 때 -> products 테이블 barcode 자동으로 검문
부모 테이블 products에 존재하지 않는 barcode면 에러처리
ON DELETE / ON UPDATE 옵션
부모 테이블 products에서 바코드를 삭제하거나 수정하려고 하면 ??
| 옵션 |
동작 |
| RESTRICT (기본값) |
부모의 삭제와 수정을 막음 |
| CASCADE |
부모-> 삭제/수정, 자식-> 함께 삭제/수정 |
| SET NULL |
부모가 삭제되면 자식의 해당 컬럼을 NULL로 처리 |
사용 예시
FOREIGN KEY (barcode) REFERENCES products(barcode)
ON DELETE CASCADE -- 부모(products) 삭제 시 자식(inventory)도 삭제
ON UPDATE RESTRICT -- 부모(products) 수정 불가 ❌
);
FOREIGN KEY 설정 실패
🚨 에러 메시지
inventory 테이블을 만드는데 애러발생
Failed to add the foreign key constraint.
Missing unique key for constraint 'inventory_ibfk_1' in the referenced table 'products'
-> 참조하려는 부모(products)의 바코드에 'UNIQUE(유일함)' 보장이 없어서 연결할 수 없음
원인 분석
"참조할 대상(부모)은 반드시 유일해야 한다."
FOREIGN KEY로 참조하려는 컬럼(products.barcode)에 UNIQUE 또는 PRIMARY KEY 설정이 안 되어 있다면
같은 바코드가 여러 행에 존재할 수 있음
해결 방법
ALTER TABLE products ADD UNIQUE (barcode);
-- products 테이블 수정할건데
-- barcode에 UNIQUE 규칙을 추가할거야
구조 확인
DESC products;
✅ 한 줄 정리
PRIMARY KEY: 테이블의 대표 식별자, 딱 1개, NULL 불가
UNIQUE: 중복 불가, 여러 개 설정 가능, NULL 허용
CHAR vs VARCHAR: 고정 길이 vs 가변 길이, WMS에선 구역 코드엔 CHAR, 상품명엔 VARCHAR
FOREIGN KEY: 부모-자식 관계로 데이터 무결성 보장
ON DELETE/UPDATE: CASCADE(연쇄), RESTRICT(차단), SET NULL(무효화)