hgzero/docs/ERD-회의종료.puml
Minseo-Jo 92e4863fc7 feat: 회의종료 기능을 위한 DB 스키마 추가
## 변경 내용
- minutes 테이블에 user_id 컬럼 추가 (참석자별 회의록 지원)
  * user_id IS NULL: AI 통합 회의록
  * user_id IS NOT NULL: 참석자별 회의록

- agenda_sections 테이블 생성 (안건별 AI 요약 저장)
  * agenda_number, agenda_title
  * ai_summary_short, discussions, decisions (JSON)
  * pending_items (JSON), opinions (JSON)

- ai_summaries 테이블 생성 (AI 결과 캐싱)
  * summary_type: CONSOLIDATED, TODO_EXTRACTION
  * keywords, statistics (JSON)
  * processing_time_ms (성능 모니터링)

- todos 테이블 확장 (AI 추출 정보)
  * extracted_by: AI, MANUAL
  * section_reference: 관련 안건 참조
  * extraction_confidence: 0.00~1.00

## 문서
- DB-Schema-회의종료.md: 상세 스키마 문서
- ERD-회의종료.puml: ERD 다이어그램
- 회의종료-개발계획.md: 전체 개발 계획

## 설계 개선
- is_consolidated 컬럼 제거 (user_id로 구분 가능)
- 중복 정보 제거로 데이터 일관성 향상
2025-10-28 11:21:32 +09:00

152 lines
3.6 KiB
Plaintext

@startuml ERD-회의종료
!theme mono
' ========================================
' 회의종료 기능 ERD
' ========================================
!define TABLE(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define PRIMARY_KEY(x) <b>PK: x</b>
!define FOREIGN_KEY(x) <i>FK: x</i>
!define NOT_NULL(x) <u>x</u>
!define UNIQUE(x) <color:blue>x</color>
' 기존 테이블
TABLE(meetings, "meetings\n회의") {
PRIMARY_KEY(meeting_id: VARCHAR(50))
--
title: VARCHAR(200)
start_time: TIMESTAMP
end_time: TIMESTAMP
status: VARCHAR(20)
created_at: TIMESTAMP
updated_at: TIMESTAMP
}
TABLE(meeting_participants, "meeting_participants\n회의 참석자") {
PRIMARY_KEY(meeting_id, user_id)
--
FOREIGN_KEY(meeting_id: VARCHAR(50))
FOREIGN_KEY(user_id: VARCHAR(100))
invitation_status: VARCHAR(20)
attended: BOOLEAN
created_at: TIMESTAMP
}
' 확장된 minutes 테이블
TABLE(minutes, "minutes\n회의록") {
PRIMARY_KEY(id: VARCHAR(36))
--
FOREIGN_KEY(meeting_id: VARCHAR(50))
content: TEXT
NOT_NULL(user_id: VARCHAR(100))
NOT_NULL(is_consolidated: BOOLEAN)
consolidated_by: VARCHAR(255)
section_type: VARCHAR(50)
created_at: TIMESTAMP
updated_at: TIMESTAMP
}
' 신규 테이블: agenda_sections
TABLE(agenda_sections, "agenda_sections\n안건별 섹션") {
PRIMARY_KEY(id: VARCHAR(36))
--
FOREIGN_KEY(minutes_id: VARCHAR(36))
FOREIGN_KEY(meeting_id: VARCHAR(50))
NOT_NULL(agenda_number: INT)
NOT_NULL(agenda_title: VARCHAR(200))
ai_summary_short: TEXT
discussions: TEXT
decisions: JSON
pending_items: JSON
opinions: JSON
created_at: TIMESTAMP
updated_at: TIMESTAMP
}
' 신규 테이블: ai_summaries
TABLE(ai_summaries, "ai_summaries\nAI 요약 캐시") {
PRIMARY_KEY(id: VARCHAR(36))
--
FOREIGN_KEY(meeting_id: VARCHAR(50))
NOT_NULL(summary_type: VARCHAR(50))
NOT_NULL(source_minutes_ids: JSON)
NOT_NULL(result: JSON)
processing_time_ms: INT
model_version: VARCHAR(50)
keywords: JSON
statistics: JSON
created_at: TIMESTAMP
}
' 확장된 todos 테이블
TABLE(todos, "todos\n할일") {
PRIMARY_KEY(id: VARCHAR(36))
--
FOREIGN_KEY(meeting_id: VARCHAR(50))
content: TEXT
assignee: VARCHAR(100)
due_date: DATE
priority: VARCHAR(20)
status: VARCHAR(20)
NOT_NULL(extracted_by: VARCHAR(50))
section_reference: VARCHAR(200)
extraction_confidence: DECIMAL(3,2)
created_at: TIMESTAMP
updated_at: TIMESTAMP
}
' 관계 정의
meetings "1" --> "N" minutes : "has"
meetings "1" --> "N" meeting_participants : "has"
meetings "1" --> "N" agenda_sections : "has"
meetings "1" --> "N" ai_summaries : "has"
meetings "1" --> "N" todos : "has"
minutes "1" --> "N" agenda_sections : "contains"
minutes "1" ..> "1" meeting_participants : "written by\n(user_id)"
' 노트 추가
note right of minutes
**참석자별 회의록**
- is_consolidated = false
- section_type = 'PARTICIPANT'
- user_id: 작성자
**AI 통합 회의록**
- is_consolidated = true
- section_type = 'CONSOLIDATED'
- user_id: NULL
end note
note right of agenda_sections
**JSON 필드 구조**
- decisions: ["결정1", "결정2"]
- pending_items: ["보류1"]
- opinions: [
{"speaker": "김민준", "opinion": "..."}
]
end note
note right of ai_summaries
**summary_type**
- CONSOLIDATED: 통합 요약
- TODO_EXTRACTION: Todo 추출
**캐싱 전략**
- 재조회 시 DB 우선 조회
- 처리 시간 <0.5초
end note
note right of todos
**extracted_by**
- AI: AI 자동 추출
- MANUAL: 사용자 수동 작성
**extraction_confidence**
- 0.00 ~ 1.00
- 0.80 이상: 신뢰도 높음
end note
@enduml