@startuml ERD-회의종료 !theme mono ' ======================================== ' 회의종료 기능 ERD ' ======================================== !define TABLE(name,desc) class name as "desc" << (T,#FFAAAA) >> !define PRIMARY_KEY(x) PK: x !define FOREIGN_KEY(x) FK: x !define NOT_NULL(x) x !define UNIQUE(x) x ' 기존 테이블 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