-- TK-MP BOM 시스템 데이터베이스 스키마 -- 생성일: 2025.07.14 -- ================================ -- 1. 프로젝트 관리 -- ================================ -- 프로젝트 기본 정보 CREATE TABLE projects ( id SERIAL PRIMARY KEY, -- 회사 공식 정보 official_project_code VARCHAR(50) UNIQUE, -- PP5-5701-DRYING (정식 코드) project_name VARCHAR(200) NOT NULL, client_name VARCHAR(100), -- 설계팀 사용 정보 design_project_code VARCHAR(50), -- 설계팀이 실제 사용한 코드 design_project_name VARCHAR(200), -- 설계팀이 사용한 프로젝트명 -- 매칭 정보 is_code_matched BOOLEAN DEFAULT false, -- 정식 코드 매칭 완료 여부 matched_by VARCHAR(100), -- 매칭 작업자 matched_at TIMESTAMP, -- 매칭 완료 시점 -- 기본 정보 status VARCHAR(20) DEFAULT 'active', -- active/completed/on_hold created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, description TEXT, notes TEXT ); -- ================================ -- 2. 파일 관리 -- ================================ -- 업로드된 자재 목록 파일들 CREATE TABLE files ( id SERIAL PRIMARY KEY, project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE, filename VARCHAR(255) NOT NULL, original_filename VARCHAR(255) NOT NULL, file_path VARCHAR(500) NOT NULL, revision VARCHAR(20) DEFAULT 'Rev.0', -- Rev.0, Rev.1, Rev.2 upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, uploaded_by VARCHAR(100), file_type VARCHAR(10), -- excel/csv/txt file_size INTEGER, is_active BOOLEAN DEFAULT true ); -- ================================ -- 3. 자재 정보 (핵심 테이블) -- ================================ -- 개별 자재 상세 정보 CREATE TABLE materials ( id SERIAL PRIMARY KEY, file_id INTEGER REFERENCES files(id) ON DELETE CASCADE, line_number INTEGER, -- Excel 행 번호 original_description TEXT NOT NULL, -- 원본 품명 -- 분류 정보 classified_category VARCHAR(50), -- 파이프/피팅/볼트/밸브/계기 classified_subcategory VARCHAR(100), -- 엘보우/플랜지/벤드 등 -- 재질 및 스펙 material_grade VARCHAR(50), -- A333-6, A105, SS316 schedule VARCHAR(20), -- SCH40, SCH80, STD size_spec VARCHAR(50), -- 6인치, 150A, M16 -- 수량 정보 quantity DECIMAL(10,3) NOT NULL, unit VARCHAR(10) NOT NULL, -- EA/mm/SET/kg -- 도면 정보 drawing_name VARCHAR(100), -- P&ID-001-TANK area_code VARCHAR(20), -- #01, #02, #03 line_no VARCHAR(50), -- LINE-001-A -- 분류 신뢰도 및 검증 classification_confidence DECIMAL(3,2), -- 0.00-1.00 분류 신뢰도 classification_details JSONB, -- 분류 상세 정보 (JSON) is_verified BOOLEAN DEFAULT false, -- 사용자 검증 여부 verified_by VARCHAR(100), verified_at TIMESTAMP, -- 기타 drawing_reference VARCHAR(100), notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ================================ -- 4. 인덱스 생성 (성능 최적화) -- ================================ -- 프로젝트 관련 인덱스 CREATE INDEX idx_projects_official_code ON projects(official_project_code); CREATE INDEX idx_projects_design_code ON projects(design_project_code); -- 파일 관련 인덱스 CREATE INDEX idx_files_project ON files(project_id); CREATE INDEX idx_files_active ON files(is_active); -- 자재 관련 인덱스 CREATE INDEX idx_materials_file ON materials(file_id); CREATE INDEX idx_materials_category ON materials(classified_category, classified_subcategory); CREATE INDEX idx_materials_material_size ON materials(material_grade, size_spec); -- ================================ -- 5. 기본 뷰 생성 -- ================================ -- 프로젝트 상태 요약 뷰 CREATE VIEW project_status_view AS SELECT p.id, COALESCE(p.official_project_code, p.design_project_code) as display_code, p.project_name, p.status, COUNT(f.id) as file_count, COUNT(m.id) as material_count, p.created_at FROM projects p LEFT JOIN files f ON p.id = f.project_id AND f.is_active = true LEFT JOIN materials m ON f.id = m.file_id GROUP BY p.id, p.official_project_code, p.design_project_code, p.project_name, p.status, p.created_at ORDER BY p.created_at DESC;