Files
sam-docs/system/database/README.md
권혁성 d4e5f62413 docs: [종합정비] Phase 1 시스템 현황 문서 14개 작성
- system/overview.md: 전체 아키텍처 개요
- system/api-structure.md: API 구조 (220 모델, 1027 엔드포인트, 18 라우트 도메인)
- system/react-structure.md: React 구조 (249 페이지, 612 컴포넌트)
- system/mng-structure.md: MNG 구조 (171 컨트롤러, 436 Blade 뷰)
- system/docker-setup.md: Docker 7 컨테이너 구성
- system/database/README.md + 9개 도메인 스키마 (270+ 테이블)
  - core, hr, sales, production, finance, boards, files, system, erp-analysis

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:13 +09:00

193 lines
6.6 KiB
Markdown

# 데이터베이스 스키마 현황
> **최종 갱신**: 2026-02-27
> **DB**: MySQL 8.0 (samdb + sam_stat)
> **마이그레이션**: 459개 (api/에서만 관리)
---
## 1. 규모 요약
| 항목 | 수량 |
|------|------|
| Eloquent 모델 | 220 |
| 도메인 그룹 | 32 |
| 마이그레이션 | 459 (메인 437 + 통계 22) |
| DB 연결 | 2 (samdb, sam_stat) |
---
## 2. 도메인별 모델 분포
| 도메인 | 모델 수 | 주요 엔티티 | 상세 |
|--------|---------|------------|------|
| Tenants | 56 | Tenant, Department, Approval, Payment, Stock 등 | [tenants.md](tenants.md) |
| Stats | 21 | StatFinanceDaily, DimClient, DimDate 등 | [stats.md](stats.md) |
| Documents | 15 | Document, DocumentTemplate, DocumentApproval 등 | [documents.md](documents.md) |
| Commons | 10 | Category, File, Menu, Tag, Classification | [commons.md](commons.md) |
| Quote | 8 | Quote, QuoteItem, QuoteFormula, QuoteRevision | [sales.md](sales.md) |
| Production | 8 | WorkOrder, WorkOrderItem, WorkResult 등 | [production.md](production.md) |
| Orders | 8 | Order, OrderItem, OrderNode, Client 등 | [sales.md](sales.md) |
| ItemMaster | 8 | ItemField, ItemPage, ItemBomItem, CustomTab 등 | [products.md](products.md) |
| Products | 6 | Product, ProductComponent, Part, Price | [products.md](products.md) |
| Interview | 5 | InterviewTemplate, InterviewSession 등 | [hr.md](hr.md) |
| Construction | 5 | Contract, HandoverReport, StructureReview | [production.md](production.md) |
| Boards | 5 | Board, Post, BoardSetting, PostCustomFieldValue | [commons.md](commons.md) |
| Members | 4 | User, UserTenant, UserRole, UserMenuPermission | [tenants.md](tenants.md) |
| Materials | 4 | Material, MaterialReceipt, MaterialInspection | [production.md](production.md) |
| ESign | 4 | EsignContract, EsignSigner, EsignSignField | [documents.md](documents.md) |
| Design | 4 | DesignModel, ModelVersion, BomTemplate | [products.md](products.md) |
| Qualitys | 3 | Inspection, Lot, LotSale | [production.md](production.md) |
| Permissions | 3 | Permission, Role, PermissionOverride | [tenants.md](tenants.md) |
| Items | 3 | Item, ItemDetail, ItemReceipt | [products.md](products.md) |
| BadDebts | 3 | BadDebt, BadDebtDocument, BadDebtMemo | [finance.md](finance.md) |
| Estimate | 2 | Estimate, EstimateItem | [sales.md](sales.md) |
| Audit | 2 | AuditLog, TriggerAuditLog | [commons.md](commons.md) |
| Root Level | 27 | ApiKey, Process, NumberingSequence 등 | 각 도메인 문서 참조 |
---
## 3. 핵심 엔티티 관계도
### 인증 + 멀티테넌시
```
User
├─ hasMany UserTenant (pivot: is_active, is_default)
│ └─ belongsTo Tenant
├─ hasMany UserRole
└─ hasMany UserMenuPermission
Tenant
├─ hasMany Department (계층 구조, parent_id)
│ └─ belongsToMany User (department_user pivot)
├─ hasMany TenantUserProfile (테넌트별 직원 프로필)
└─ hasMany [모든 tenant-scoped 모델]
```
### 제품 + 설계
```
Product
├─ belongsTo Category (계층 분류)
├─ hasMany ProductComponent (BOM)
├─ hasMany Part, Price
└─ morphMany File
DesignModel
└─ hasMany ModelVersion
└─ hasMany BomTemplate
└─ hasMany BomTemplateItem
```
### 견적 → 수주 → 생산 흐름
```
Quote (견적)
├─ belongsTo Client
├─ hasMany QuoteItem
└─ → Order 변환
Order (수주)
├─ belongsTo Quote, Client
├─ hasMany OrderItem (options JSON)
├─ hasMany OrderNode (설계 분해)
└─ hasMany WorkOrder
WorkOrder (작업지시)
├─ belongsTo Order, Process
├─ hasMany WorkOrderItem (options JSON)
├─ hasMany WorkOrderStepProgress
└─ hasMany WorkResult (작업실적)
```
### 문서 + 전자결재
```
Document
├─ belongsTo DocumentTemplate
├─ morphTo linkable (다형 - Order, Quote 등)
├─ hasMany DocumentApproval (결재 단계)
└─ hasMany DocumentData (동적 폼)
DocumentTemplate
├─ hasMany Section → Field → Item
└─ hasMany ApprovalLine (결재선)
```
---
## 4. 공통 패턴
### 트레이트 사용 현황
| 트레이트 | 적용 모델 수 | 역할 |
|---------|-------------|------|
| BelongsToTenant | ~160 (73%) | tenant_id 자동 스코핑 |
| Auditable | ~150 (68%) | created_by, updated_by, deleted_by |
| SoftDeletes | ~150 (68%) | 논리 삭제 (deleted_at) |
| ModelTrait | ~80 (36%) | 날짜 처리, is_active 스코프 |
| HasRoles (Spatie) | 3 | RBAC 권한 관리 |
| HasApiTokens (Sanctum) | 1 (User) | API 토큰 관리 |
### 표준 컬럼 구조
모든 비즈니스 테이블의 공통 컬럼:
```
id PK
tenant_id FK (멀티테넌시)
created_by FK → users (감사)
updated_by FK → users (감사)
deleted_by FK → users (감사)
created_at timestamp
updated_at timestamp
deleted_at timestamp (논리삭제)
is_active boolean
sort_order integer
options JSON (유연한 속성 저장)
```
### DB 설계 패턴
| 패턴 | 사용 예시 |
|------|----------|
| 계층 구조 (Self-Reference) | Category, Department (parent_id) |
| 다형 관계 (Polymorphic) | File, PermissionOverride (morphable_type/id) |
| EAV (Entity-Attribute-Value) | PostCustomFieldValue, CategoryField |
| JSON 컬럼 | Product.bom, OrderItem.options, WorkOrderItem.options |
| Pivot 테이블 | user_tenants, department_user |
| BOM/Tree | ProductComponent, BomTemplateItem |
| 버전 관리 | ModelVersion, QuoteRevision, OrderVersion |
| 상태 코드 | Order.status (DRAFT/CONFIRMED/IN_PRODUCTION) |
### JSON options 컬럼 정책
> **FK/조인키만** 테이블 컬럼으로 추가.
> **나머지 속성은** `options` 또는 `attributes` JSON에 저장.
> 이유: 멀티테넌시 환경에서 테넌트별 스키마 변경 없이 유연한 관리.
---
## 5. DB 연결
| 연결명 | DB | 용도 |
|--------|-----|------|
| mysql (기본) | samdb | 모든 비즈니스 데이터 |
| sam_stat | sam_stat | 통계/집계 전용 (21 모델) |
| chandj | chandj | 레거시 5130 (마이그레이션 대상) |
---
## 6. 도메인별 상세 문서
| 문서 | 포함 도메인 |
|------|-----------|
| [tenants.md](tenants.md) | Tenants, Members, Permissions |
| [products.md](products.md) | Products, ItemMaster, Items, Design |
| [sales.md](sales.md) | Orders, Quote, Estimate |
| [production.md](production.md) | Production, Construction, Materials, Qualitys |
| [finance.md](finance.md) | Finance (Tenants 하위), BadDebts |
| [hr.md](hr.md) | HR (Tenants 하위), Interview |
| [documents.md](documents.md) | Documents, ESign |
| [commons.md](commons.md) | Commons, Boards, Audit |
| [stats.md](stats.md) | Stats (sam_stat DB) |