hgzero/claude/database-diagram.puml

131 lines
3.0 KiB
Plaintext

@startuml Meeting Service Database Schema
!theme mono
'=== Core Tables ===
entity "meetings" {
* **meeting_id : VARCHAR(50)
--
title : VARCHAR(200) NOT NULL
purpose : VARCHAR(500)
description : TEXT
scheduled_at : TIMESTAMP NOT NULL
started_at : TIMESTAMP
ended_at : TIMESTAMP [V3]
status : VARCHAR(20) NOT NULL
organizer_id : VARCHAR(50) NOT NULL
created_at : TIMESTAMP
updated_at : TIMESTAMP
template_id : VARCHAR(50)
}
entity "meeting_participants" {
* **meeting_id : VARCHAR(50) [FK]
* **user_id : VARCHAR(100)
--
invitation_status : VARCHAR(20)
attended : BOOLEAN
created_at : TIMESTAMP
updated_at : TIMESTAMP
}
entity "minutes" {
* **id : VARCHAR(50)
--
meeting_id : VARCHAR(50) [FK] NOT NULL
user_id : VARCHAR(100) [V3]
title : VARCHAR(200) NOT NULL
status : VARCHAR(20) NOT NULL
version : INT NOT NULL
created_by : VARCHAR(50) NOT NULL
finalized_by : VARCHAR(50)
finalized_at : TIMESTAMP
created_at : TIMESTAMP
updated_at : TIMESTAMP
}
entity "minutes_sections" {
* **id : VARCHAR(50)
--
minutes_id : VARCHAR(50) [FK] NOT NULL
type : VARCHAR(50) NOT NULL
title : VARCHAR(200) NOT NULL
**content : TEXT
order : INT
verified : BOOLEAN
locked : BOOLEAN
locked_by : VARCHAR(50)
created_at : TIMESTAMP
updated_at : TIMESTAMP
}
'=== V3 New Tables ===
entity "agenda_sections" {
* **id : VARCHAR(36)
--
minutes_id : VARCHAR(36) [FK] NOT NULL
meeting_id : VARCHAR(50) [FK] NOT NULL
agenda_number : INT NOT NULL
agenda_title : VARCHAR(200) NOT NULL
ai_summary_short : TEXT
discussions : TEXT
decisions : JSON
pending_items : JSON
opinions : JSON
**todos : JSON [V4]
created_at : TIMESTAMP
updated_at : TIMESTAMP
}
entity "ai_summaries" {
* **id : VARCHAR(36)
--
meeting_id : VARCHAR(50) [FK] NOT NULL
summary_type : VARCHAR(50) NOT NULL
source_minutes_ids : JSON NOT NULL
result : JSON NOT NULL
processing_time_ms : INT
model_version : VARCHAR(50)
keywords : JSON
statistics : JSON
created_at : TIMESTAMP
}
entity "todos" {
* **todo_id : VARCHAR(50)
--
meeting_id : VARCHAR(50) [FK] NOT NULL
minutes_id : VARCHAR(50) [FK]
title : VARCHAR(200) NOT NULL
description : TEXT
assignee_id : VARCHAR(50) NOT NULL
due_date : DATE
status : VARCHAR(20) NOT NULL
priority : VARCHAR(20)
extracted_by : VARCHAR(50) [V3]
section_reference : VARCHAR(200) [V3]
extraction_confidence : DECIMAL(3,2) [V3]
completed_at : TIMESTAMP
created_at : TIMESTAMP
updated_at : TIMESTAMP
}
'=== Relationships ===
meetings ||--o{ meeting_participants : "1:N [V2]"
meetings ||--o{ minutes : "1:N"
meetings ||--o{ agenda_sections : "1:N [V3]"
meetings ||--o{ ai_summaries : "1:N [V3]"
meetings ||--o{ todos : "1:N"
minutes ||--o{ minutes_sections : "1:N"
minutes ||--o{ agenda_sections : "1:N [V3]"
'=== Legend ===
legend right
V2 = Migration 2 (2025-10-27)
V3 = Migration 3 (2025-10-28)
V4 = Migration 4 (2025-10-28)
[FK] = Foreign Key
**bold** = Important fields
end legend
@enduml