# 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
```