# 데이터베이스 설계 초안

## 1. 설계 방향

업무의 현재 상태와 입력 이력, AI 분석 결과, 리포트 결과를 분리해서 저장한다.

이 구조를 사용하면 다음 장점이 있다.

- 현재 업무 현황을 빠르게 조회할 수 있다.
- 어떤 입력 때문에 업무가 변경되었는지 추적할 수 있다.
- AI 판단 오류를 나중에 검토할 수 있다.
- 리포트 생성 결과를 고정된 기록으로 보관할 수 있다.

## 2. users

담당자 및 시스템 사용자를 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 사용자 ID |
| name | varchar | 이름 |
| department | varchar | 부서 |
| position | varchar | 직책 |
| phone | varchar | 연락처 |
| email | varchar | 이메일 |
| role | varchar | 권한 |
| is_active | boolean | 활성 여부 |
| created_at | datetime | 생성일 |
| updated_at | datetime | 수정일 |

## 3. user_aliases

AI 담당자 매칭을 위한 별칭을 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 별칭 ID |
| user_id | bigint | 사용자 ID |
| alias | varchar | 별칭 |
| created_at | datetime | 생성일 |

## 4. tasks

업무의 현재 상태를 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 업무 ID |
| title | varchar | 업무 제목 |
| description | text | 업무 설명 |
| assignee_id | bigint | 담당자 ID |
| status | varchar | 상태 |
| priority | varchar | 우선순위 |
| due_date | date | 마감일 |
| source_input_id | bigint | 최초 입력 ID |
| created_by | bigint | 생성자 ID |
| created_at | datetime | 생성일 |
| updated_at | datetime | 수정일 |
| completed_at | datetime | 완료일 |
| is_review_required | boolean | 확인 필요 여부 |

## 5. task_updates

업무 변경 이력을 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 업데이트 ID |
| task_id | bigint | 업무 ID |
| raw_input_id | bigint | 원본 입력 ID |
| update_type | varchar | 업데이트 유형 |
| previous_status | varchar | 이전 상태 |
| new_status | varchar | 변경 상태 |
| note | text | 업데이트 내용 |
| created_by | bigint | 작성자 ID |
| created_at | datetime | 생성일 |

## 6. raw_inputs

사용자의 원본 입력을 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 입력 ID |
| input_type | varchar | voice 또는 text |
| original_text | text | 원문 텍스트 |
| transcribed_text | text | 음성 변환 텍스트 |
| audio_file_path | varchar | 음성 파일 경로 |
| submitted_by | bigint | 입력자 ID |
| submitted_at | datetime | 입력 시간 |
| processing_status | varchar | 처리 상태 |

## 7. ai_analysis_logs

AI 분석 결과를 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 분석 ID |
| raw_input_id | bigint | 원본 입력 ID |
| intent | varchar | 분석 의도 |
| confidence | decimal | 신뢰도 |
| matched_task_id | bigint | 매칭 업무 ID |
| matched_user_id | bigint | 매칭 담당자 ID |
| extracted_due_date | date | 추출 마감일 |
| extracted_priority | varchar | 추출 우선순위 |
| extracted_status | varchar | 추출 상태 |
| summary | text | 요약 |
| analysis_json | json | 전체 분석 JSON |
| needs_human_review | boolean | 사람 검토 필요 여부 |
| created_at | datetime | 생성일 |

## 8. daily_reports

생성된 리포트를 저장한다.

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| id | bigint | 리포트 ID |
| report_date | date | 리포트 기준일 |
| report_type | varchar | overall 또는 user |
| target_user_id | bigint | 개인 리포트 대상자 |
| title | varchar | 리포트 제목 |
| body_text | text | 리포트 본문 |
| body_json | json | 구조화 리포트 |
| generated_at | datetime | 생성 시간 |

## 9. 권장 인덱스

- `tasks.assignee_id`
- `tasks.status`
- `tasks.due_date`
- `tasks.updated_at`
- `task_updates.task_id`
- `raw_inputs.submitted_at`
- `ai_analysis_logs.raw_input_id`
- `daily_reports.report_date`
- `daily_reports.report_type`
- `daily_reports.target_user_id`

## 10. 상태 값

### 업무 상태

- new
- in_progress
- waiting
- review_required
- completed
- on_hold
- canceled

### 우선순위

- low
- normal
- high
- urgent

### 입력 처리 상태

- received
- transcribed
- analyzed
- applied
- review_required
- failed
