Files
sam-docs/projects/5130-migration/phase-2-target-analysis/sam-item-schema.md
kent e217266376 docs: 5130 → SAM 품목 마이그레이션 문서 추가
- MASTER_PLAN.md: 마이그레이션 전체 계획
- PROGRESS.md: 진행 상황 및 최종 결과
- phase-1: 5130 소스 스키마 분석
- phase-2: SAM 타겟 스키마 분석
- phase-3: 필드 매핑 설계

마이그레이션 결과:
- 총 425건 품목 이관 완료 (models 18, parts 36, parts_sub 117, BDmodels 59, BOM 195)
- tenant_id: 287 (경동기업)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-21 13:49:28 +09:00

249 lines
10 KiB
Markdown

# SAM 품목 테이블 스키마 분석
> 분석일: 2025-12-21
> DB: samdb (MySQL 8.0)
---
## 1. 테이블 구조 개요
### 1.1 품목 관련 테이블
| 테이블 | 설명 |
|--------|------|
| `items` | 품목 기본 정보 (통합 테이블) |
| `item_details` | 품목 상세 정보 |
| `item_sections` | 섹션 정의 (UI 그룹핑) |
| `item_fields` | 필드 정의 (동적 속성) |
| `item_pages` | 페이지 정의 (품목 유형별) |
| `item_bom_items` | BOM 구성 품목 |
| `item_id_mappings` | 레거시 ID 매핑 |
| `entity_relationships` | 엔티티 간 관계 |
### 1.2 Multi-tenant 구조
모든 테이블에 `tenant_id` 필드로 테넌트 분리
---
## 2. 테이블 상세 스키마
### 2.1 items (품목 기본 정보)
| 필드 | 타입 | NULL | 키 | 설명 |
|------|------|------|-----|------|
| id | bigint unsigned | NO | PRI | 품목 ID |
| tenant_id | bigint unsigned | NO | MUL | 테넌트 ID |
| item_type | varchar(15) | NO | | 품목 유형 (FG/PT/SM/RM/CS) |
| code | varchar(100) | NO | | 품목 코드 |
| name | varchar(255) | NO | | 품목명 |
| unit | varchar(20) | YES | | 단위 |
| category_id | bigint unsigned | YES | | 카테고리 ID |
| bom | json | YES | | BOM 정보 (JSON) |
| attributes | json | YES | | 동적 속성 (JSON) |
| attributes_archive | json | YES | | 속성 이력 |
| options | json | YES | | 옵션 |
| description | text | YES | | 설명 |
| is_active | tinyint(1) | NO | | 활성 여부 |
| created_by | bigint unsigned | YES | | 생성자 |
| updated_by | bigint unsigned | YES | | 수정자 |
| deleted_by | bigint unsigned | YES | | 삭제자 |
| created_at | timestamp | YES | | 생성일 |
| updated_at | timestamp | YES | | 수정일 |
| deleted_at | timestamp | YES | | 삭제일 (Soft Delete) |
**item_type 값:**
- `FG`: Finished Goods (완제품)
- `PT`: Parts (부품)
- `SM`: Semi-finished (반제품)
- `RM`: Raw Materials (원자재)
- `CS`: Consumables (소모품)
### 2.2 item_details (품목 상세)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| item_id | bigint unsigned | NO | 품목 ID (FK) |
| is_sellable | tinyint(1) | NO | 판매 가능 |
| is_purchasable | tinyint(1) | NO | 구매 가능 |
| is_producible | tinyint(1) | NO | 생산 가능 |
| safety_stock | int | YES | 안전 재고 |
| lead_time | int | YES | 리드 타임 |
| is_variable_size | tinyint(1) | NO | 가변 사이즈 |
| product_category | varchar(50) | YES | 제품 분류 |
| part_type | varchar(50) | YES | 부품 유형 |
| bending_diagram | varchar(255) | YES | 벤딩 도면 |
| bending_details | json | YES | 벤딩 상세 |
| specification_file | varchar(255) | YES | 규격서 파일 |
| certification_file | varchar(255) | YES | 인증서 파일 |
| certification_number | varchar(255) | YES | 인증 번호 |
| certification_start_date | date | YES | 인증 시작일 |
| certification_end_date | date | YES | 인증 종료일 |
| is_inspection | varchar(1) | NO | 검사 대상 여부 |
| item_name | varchar(255) | YES | 품목명 (검색용) |
| specification | varchar(255) | YES | 규격 |
| search_tag | text | YES | 검색 태그 |
| remarks | text | YES | 비고 |
### 2.3 item_bom_items (BOM 구성)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| tenant_id | bigint unsigned | NO | 테넌트 ID |
| group_id | int unsigned | NO | 그룹 ID |
| item_code | varchar(100) | YES | 품목 코드 |
| item_name | varchar(255) | NO | 품목명 |
| quantity | decimal(15,4) | NO | 수량 |
| unit | varchar(50) | YES | 단위 |
| unit_price | decimal(15,2) | YES | 단가 |
| total_price | decimal(15,2) | YES | 합계 |
| spec | text | YES | 규격 |
| note | text | YES | 비고 |
### 2.4 item_sections (섹션 정의)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| tenant_id | bigint unsigned | NO | 테넌트 ID |
| group_id | int unsigned | NO | 그룹 ID |
| title | varchar(255) | NO | 섹션 제목 |
| type | enum('fields','bom') | NO | 섹션 유형 |
| order_no | int | NO | 정렬 순서 |
| is_template | tinyint(1) | NO | 템플릿 여부 |
| is_default | tinyint(1) | NO | 기본 여부 |
| description | text | YES | 설명 |
### 2.5 item_fields (필드 정의)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| tenant_id | bigint unsigned | NO | 테넌트 ID |
| group_id | int unsigned | NO | 그룹 ID |
| field_name | varchar(255) | NO | 필드명 |
| field_key | varchar(100) | YES | 필드 키 |
| field_type | enum(...) | NO | 필드 유형 |
| order_no | int | NO | 정렬 순서 |
| is_required | tinyint(1) | NO | 필수 여부 |
| default_value | text | YES | 기본값 |
| validation_rules | json | YES | 검증 규칙 |
| options | json | YES | 선택 옵션 |
| storage_type | enum('column','json') | NO | 저장 방식 |
| json_path | varchar(200) | YES | JSON 경로 |
| is_common | tinyint(1) | NO | 공통 필드 여부 |
| is_active | tinyint(1) | NO | 활성 여부 |
**field_type 값:**
- `textbox`, `number`, `dropdown`, `checkbox`, `date`, `textarea`
### 2.6 item_pages (페이지 정의)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| tenant_id | bigint unsigned | NO | 테넌트 ID |
| group_id | int unsigned | NO | 그룹 ID |
| page_name | varchar(255) | NO | 페이지명 |
| item_type | enum('FG','PT','SM','RM','CS') | NO | 품목 유형 |
| source_table | varchar(100) | YES | 소스 테이블 |
| absolute_path | varchar(500) | YES | 절대 경로 |
| is_active | tinyint(1) | NO | 활성 여부 |
### 2.7 item_id_mappings (레거시 매핑)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| source_table | varchar(20) | NO | 소스 테이블 |
| source_id | bigint unsigned | NO | 소스 ID |
| item_id | bigint unsigned | NO | SAM 품목 ID |
> ⭐ **마이그레이션 추적용 테이블** - 5130 원본 ID와 SAM ID 매핑
### 2.8 entity_relationships (엔티티 관계)
| 필드 | 타입 | NULL | 설명 |
|------|------|------|------|
| id | bigint unsigned | NO | ID |
| tenant_id | bigint unsigned | NO | 테넌트 ID |
| group_id | int unsigned | NO | 그룹 ID |
| parent_type | varchar(50) | NO | 부모 엔티티 유형 |
| parent_id | bigint unsigned | NO | 부모 ID |
| child_type | varchar(50) | NO | 자식 엔티티 유형 |
| child_id | bigint unsigned | NO | 자식 ID |
| order_no | int | NO | 정렬 순서 |
| metadata | json | YES | 메타데이터 |
---
## 3. 관계도
```
┌─────────────────────────────────────────────────────────────┐
│ items │
│ (통합 품목 테이블: FG/PT/SM/RM/CS) │
│ │
│ id, tenant_id, item_type, code, name, attributes(JSON) │
└──────────────────────┬───────────────────────────────────────┘
┌───────────┼───────────┬────────────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐
│ item_ │ │ item_ │ │ item_ │ │ entity_ │
│ details │ │bom_items │ │id_mappings│ │ relationships │
│ │ │ │ │ │ │ │
│ 1:1 관계 │ │ BOM 구성 │ │ 레거시 │ │ 일반 관계 │
│ │ │ │ │ ID 매핑 │ │ (N:N 가능) │
└──────────┘ └──────────┘ └──────────┘ └───────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 메타데이터 테이블 │
├─────────────────┬─────────────────┬─────────────────────────┤
│ item_sections │ item_fields │ item_pages │
│ (섹션 정의) │ (필드 정의) │ (페이지 정의) │
│ UI 그룹핑 용도 │ 동적 속성 정의 │ 품목 유형별 페이지 │
└─────────────────┴─────────────────┴─────────────────────────┘
```
---
## 4. 5130 → SAM 매핑 전략
### 4.1 테이블 매핑
| 5130 테이블 | → | SAM 테이블 | item_type |
|-------------|---|-----------|-----------|
| models | → | items | FG (완제품) |
| parts | → | items | PT (부품) |
| parts_sub | → | items | RM (원자재) |
### 4.2 관계 매핑
| 5130 관계 | → | SAM 구현 |
|-----------|---|----------|
| parts.model_id → models | → | entity_relationships (parent=FG, child=PT) |
| parts_sub.part_id → parts | → | entity_relationships (parent=PT, child=RM) |
| 또는 | → | item_bom_items로 BOM 구성 |
### 4.3 필드 매핑
| 5130 필드 | → | SAM 필드 |
|-----------|---|----------|
| model_name / part_name / subpart_name | → | items.name |
| spec | → | item_details.specification |
| unit | → | items.unit |
| quantity | → | item_bom_items.quantity |
| material | → | items.attributes.material |
| major_category | → | items.attributes.major_category |
| finishing_type | → | items.attributes.finishing_type |
### 4.4 ID 추적
`item_id_mappings` 테이블 활용:
```sql
-- 마이그레이션 후 매핑 저장
INSERT INTO item_id_mappings (source_table, source_id, item_id)
VALUES ('models', 12, 1001); -- models.model_id=12 → items.id=1001
```