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