Files
mediaproc/docs/architecture/02-data-model.dot
2026-05-03 03:19:19 -03:00

100 lines
6.7 KiB
Plaintext

digraph data_model {
rankdir=LR
bgcolor="#0a0e17"
fontname="Helvetica"
node [fontname="Helvetica" fontsize=11 shape=plaintext]
edge [fontname="Helvetica" fontsize=9 fontcolor="#8892a8" color="#4a5568"]
label="Data Model"
labelloc=t
fontsize=16
fontcolor="#0066ff"
MediaAsset [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>MediaAsset</b></font></td></tr>
<tr><td><font color="#8892a8">id</font></td><td><font color="#e8eaf0">UUID PK</font></td></tr>
<tr><td><font color="#8892a8">filename</font></td><td><font color="#e8eaf0">str</font></td></tr>
<tr><td><font color="#8892a8">file_path</font></td><td><font color="#e8eaf0">str (relative)</font></td></tr>
<tr><td><font color="#8892a8">duration / fps / size</font></td><td><font color="#e8eaf0">probe metadata</font></td></tr>
</table>
>]
Profile [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>Profile</b></font></td></tr>
<tr><td><font color="#8892a8">name</font></td><td><font color="#e8eaf0">str</font></td></tr>
<tr><td><font color="#8892a8">pipeline</font></td><td><font color="#e8eaf0">JSONB topology</font></td></tr>
<tr><td><font color="#8892a8">configs</font></td><td><font color="#e8eaf0">JSONB per-stage</font></td></tr>
</table>
>]
Timeline [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>Timeline</b></font></td></tr>
<tr><td><font color="#8892a8">id</font></td><td><font color="#e8eaf0">UUID PK</font></td></tr>
<tr><td><font color="#8892a8">source_asset_id</font></td><td><font color="#e8eaf0">FK MediaAsset</font></td></tr>
<tr><td><font color="#8892a8">chunk_paths</font></td><td><font color="#e8eaf0">str[]</font></td></tr>
<tr><td><font color="#8892a8">profile_name</font></td><td><font color="#e8eaf0">str</font></td></tr>
<tr><td><font color="#8892a8">fps / status</font></td><td><font color="#e8eaf0">cached, ready, ...</font></td></tr>
</table>
>]
Job [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>Job</b></font></td></tr>
<tr><td><font color="#8892a8">id</font></td><td><font color="#e8eaf0">UUID PK</font></td></tr>
<tr><td><font color="#8892a8">timeline_id</font></td><td><font color="#e8eaf0">FK Timeline</font></td></tr>
<tr><td><font color="#8892a8">parent_id</font></td><td><font color="#e8eaf0">FK Job (replay tree)</font></td></tr>
<tr><td><font color="#8892a8">profile_name</font></td><td><font color="#e8eaf0">str</font></td></tr>
<tr><td><font color="#8892a8">config_overrides</font></td><td><font color="#e8eaf0">JSONB</font></td></tr>
<tr><td><font color="#8892a8">run_type</font></td><td><font color="#e8eaf0">initial / replay / retry</font></td></tr>
<tr><td><font color="#8892a8">status / current_stage</font></td><td><font color="#e8eaf0">runtime</font></td></tr>
</table>
>]
Checkpoint [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>Checkpoint</b></font></td></tr>
<tr><td><font color="#8892a8">id</font></td><td><font color="#e8eaf0">UUID PK</font></td></tr>
<tr><td><font color="#8892a8">timeline_id</font></td><td><font color="#e8eaf0">FK Timeline</font></td></tr>
<tr><td><font color="#8892a8">job_id</font></td><td><font color="#e8eaf0">FK Job (nullable)</font></td></tr>
<tr><td><font color="#8892a8">parent_id</font></td><td><font color="#e8eaf0">FK Checkpoint (tree)</font></td></tr>
<tr><td><font color="#8892a8">stage_name</font></td><td><font color="#e8eaf0">str</font></td></tr>
<tr><td><font color="#8892a8">config_overrides / stats</font></td><td><font color="#e8eaf0">JSONB (no blobs)</font></td></tr>
</table>
>]
StageOutput [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>StageOutput</b></font></td></tr>
<tr><td><font color="#8892a8">id</font></td><td><font color="#e8eaf0">UUID PK</font></td></tr>
<tr><td><font color="#8892a8">job_id</font></td><td><font color="#e8eaf0">FK Job</font></td></tr>
<tr><td><font color="#8892a8">timeline_id</font></td><td><font color="#e8eaf0">FK Timeline</font></td></tr>
<tr><td><font color="#8892a8">stage_name</font></td><td><font color="#e8eaf0">str</font></td></tr>
<tr><td><font color="#8892a8">checkpoint_id</font></td><td><font color="#e8eaf0">FK Checkpoint (nullable)</font></td></tr>
<tr><td><font color="#8892a8">output</font></td><td><font color="#e8eaf0">JSONB (flat upsert)</font></td></tr>
</table>
>]
Brand [label=<
<table border="0" cellborder="1" cellspacing="0" color="#1e2a4a" bgcolor="#121829">
<tr><td colspan="2" bgcolor="#0d1a33"><font color="#0066ff" face="JetBrains Mono"><b>Brand</b></font></td></tr>
<tr><td><font color="#8892a8">canonical_name</font></td><td><font color="#e8eaf0">str (indexed)</font></td></tr>
<tr><td><font color="#8892a8">aliases</font></td><td><font color="#e8eaf0">str[]</font></td></tr>
<tr><td><font color="#8892a8">source</font></td><td><font color="#e8eaf0">ocr / local_vlm / cloud_llm / manual</font></td></tr>
<tr><td><font color="#8892a8">airings</font></td><td><font color="#e8eaf0">JSONB[]</font></td></tr>
</table>
>]
MediaAsset -> Timeline [label="source_asset_id"]
Timeline -> Job [label="timeline_id"]
Job -> Job [label="parent_id\n(replay tree)" style=dashed]
Profile -> Job [label="profile_name" color="#0066ff"]
Job -> Checkpoint [label="job_id"]
Timeline -> Checkpoint [label="timeline_id"]
Checkpoint -> Checkpoint [label="parent_id\n(tree)" style=dashed]
Job -> StageOutput [label="job_id"]
Checkpoint -> StageOutput [label="checkpoint_id" style=dotted]
}