# M-Project 데이터베이스 스키마 문서 ## 개요 작업보고서 시스템의 PostgreSQL 데이터베이스 스키마 정의 --- ## 테이블 구조 ### 1. users (사용자) 사용자 계정 정보를 저장하는 테이블 | 컬럼명 | 타입 | 제약조건 | 설명 | |--------|------|----------|------| | id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 사용자 고유 ID | | username | VARCHAR | UNIQUE, NOT NULL, INDEX | 로그인 아이디 | | hashed_password | VARCHAR | NOT NULL | 암호화된 비밀번호 | | full_name | VARCHAR | NULL | 사용자 실명 | | role | ENUM | DEFAULT 'user' | 사용자 권한 (admin, user) | | is_active | BOOLEAN | DEFAULT TRUE | 계정 활성화 상태 | | created_at | TIMESTAMP | DEFAULT NOW() | 계정 생성일시 | **인덱스:** - `idx_users_username` ON username - `idx_users_role` ON role **ENUM 값:** - role: 'admin', 'user' --- ### 2. projects (프로젝트) 프로젝트 정보를 저장하는 테이블 | 컬럼명 | 타입 | 제약조건 | 설명 | |--------|------|----------|------| | id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 프로젝트 고유 ID | | job_no | VARCHAR(50) | UNIQUE, NOT NULL, INDEX | Job 번호 | | project_name | VARCHAR(200) | NOT NULL | 프로젝트 이름 | | created_by_id | INTEGER | FOREIGN KEY → users(id) | 생성자 ID | | created_at | TIMESTAMP | DEFAULT NOW() | 생성일시 | | is_active | BOOLEAN | DEFAULT TRUE | 활성 상태 | **인덱스:** - `idx_projects_job_no` ON job_no - `idx_projects_created_by_id` ON created_by_id - `idx_projects_is_active` ON is_active **외래키:** - created_by_id → users(id) --- ### 3. issues (부적합 사항) 부적합 사항 정보를 저장하는 테이블 | 컬럼명 | 타입 | 제약조건 | 설명 | |--------|------|----------|------| | id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 부적합 사항 고유 ID | | photo_path | VARCHAR | NULL | 첫 번째 사진 경로 | | photo_path2 | VARCHAR | NULL | 두 번째 사진 경로 | | category | ENUM | NOT NULL | 부적합 카테고리 | | description | TEXT | NOT NULL | 부적합 사항 설명 | | status | ENUM | DEFAULT 'new' | 처리 상태 | | reporter_id | INTEGER | FOREIGN KEY → users(id) | 보고자 ID | | report_date | TIMESTAMP | DEFAULT NOW() | 보고일시 | | work_hours | FLOAT | DEFAULT 0 | 작업 시간 | | detail_notes | TEXT | NULL | 상세 메모 | **인덱스:** - `idx_issues_reporter_id` ON reporter_id - `idx_issues_status` ON status - `idx_issues_category` ON category - `idx_issues_report_date` ON report_date **ENUM 값:** - category: 'material_missing', 'design_error', 'incoming_defect', 'inspection_miss' - status: 'new', 'progress', 'complete' **외래키:** - reporter_id → users(id) --- ### 4. daily_works (일일 공수) 일일 작업 공수 정보를 저장하는 테이블 | 컬럼명 | 타입 | 제약조건 | 설명 | |--------|------|----------|------| | id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 일일 공수 고유 ID | | date | TIMESTAMP | NOT NULL, INDEX | 작업 날짜 | | worker_count | INTEGER | NOT NULL | 작업자 수 | | regular_hours | FLOAT | NOT NULL | 정규 시간 | | overtime_workers | INTEGER | DEFAULT 0 | 야근 작업자 수 | | overtime_hours | FLOAT | DEFAULT 0 | 야근 시간 | | overtime_total | FLOAT | DEFAULT 0 | 야근 총 시간 | | total_hours | FLOAT | NOT NULL | 총 작업 시간 | | created_by_id | INTEGER | FOREIGN KEY → users(id) | 생성자 ID | | created_at | TIMESTAMP | DEFAULT NOW() | 생성일시 | **인덱스:** - `idx_daily_works_date` ON date - `idx_daily_works_created_by_id` ON created_by_id **외래키:** - created_by_id → users(id) --- ## 관계도 (Relationships) ``` users (1) ←→ (N) projects ↓ users (1) ←→ (N) issues ↓ users (1) ←→ (N) daily_works ``` --- ## 마이그레이션 파일 목록 1. `001_init.sql` - 초기 테이블 생성 2. `002_add_second_photo.sql` - issues 테이블에 두 번째 사진 필드 추가 3. `003_update_categories.sql` - 카테고리 업데이트 4. `004_fix_category_values.sql` - 카테고리 값 수정 5. `005_recreate_enum_type.sql` - ENUM 타입 재생성 6. `006_add_projects_table.sql` - projects 테이블 추가 --- ## 기본 데이터 ### 관리자 계정 - **Username:** hyungi - **Password:** djg3-jj34-X3Q3 - **Role:** admin - **Full Name:** 관리자 --- ## 데이터베이스 연결 정보 - **Host:** localhost (Docker 내부: db) - **Port:** 16432 (외부), 5432 (내부) - **Database:** mproject - **Username:** mproject - **Password:** mproject2024 --- ## 주의사항 1. **비밀번호 암호화:** bcrypt 해시 사용 2. **시간대:** 모든 TIMESTAMP는 Asia/Seoul (KST) 기준 3. **파일 업로드:** 사진 파일은 `/app/uploads` 디렉토리에 저장 4. **소프트 삭제:** projects 테이블은 is_active 필드로 소프트 삭제 구현 5. **인덱스 최적화:** 자주 조회되는 컬럼에 인덱스 설정 --- ## 백업 및 복구 ### 백업 ```bash docker-compose exec db pg_dump -U mproject mproject > backup.sql ``` ### 복구 ```bash docker-compose exec -T db psql -U mproject mproject < backup.sql ```