Files
backup-tool/.superpowers/brainstorm/269331-1778521434/content/data-model.html
T
alex 3deab5fdf3 fix: resolve frontend code quality issues
- Create missing tsconfig.node.json for Vite config compilation
- Create postcss.config.js for Tailwind CSS processing
- Add test dependencies (vitest, testing-library, jsdom)
- Remove missing /vite.svg favicon reference from index.html
2026-05-11 20:39:05 +02:00

129 lines
7.6 KiB
HTML

<h2>Data Model</h2>
<p class="subtitle">SQLite database schema for the backup tool</p>
<div class="section">
<div class="mockup">
<div class="mockup-header">Entity Relationship Diagram</div>
<div class="mockup-body">
<div style="display: flex; flex-direction: column; gap: 15px; font-family: monospace; font-size: 14px;">
<!-- Sources -->
<div style="border: 2px solid #4CAF50; border-radius: 6px; padding: 12px; background: #f8fff8;">
<div style="font-weight: bold; color: #4CAF50; margin-bottom: 8px;">📁 sources</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; gap: 4px 12px;">
<span style="color: #d32f2f;">PK</span> <span>id</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>name</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>type</span> <span style="color: #666;">TEXT (local|ssh|database)</span>
<span> </span> <span>config</span> <span style="color: #666;">JSON</span>
<span> </span> <span>created_at</span> <span style="color: #666;">DATETIME</span>
<span> </span> <span>updated_at</span> <span style="color: #666;">DATETIME</span>
</div>
</div>
<!-- Jobs -->
<div style="border: 2px solid #2196F3; border-radius: 6px; padding: 12px; background: #f0f8ff;">
<div style="font-weight: bold; color: #2196F3; margin-bottom: 8px;">⚙️ jobs</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; gap: 4px 12px;">
<span style="color: #d32f2f;">PK</span> <span>id</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>name</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>source_id</span> <span style="color: #666;">INTEGER → sources</span>
<span> </span> <span>strategy</span> <span style="color: #666;">TEXT (full|incremental)</span>
<span> </span> <span>destination_path</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>exclude_patterns</span> <span style="color: #666;">JSON</span>
<span> </span> <span>enabled</span> <span style="color: #666;">BOOLEAN</span>
<span> </span> <span>created_at</span> <span style="color: #666;">DATETIME</span>
<span> </span> <span>updated_at</span> <span style="color: #666;">DATETIME</span>
</div>
</div>
<!-- Schedules -->
<div style="border: 2px solid #FF9800; border-radius: 6px; padding: 12px; background: #fff8f0;">
<div style="font-weight: bold; color: #FF9800; margin-bottom: 8px;">📅 schedules</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; gap: 4px 12px;">
<span style="color: #d32f2f;">PK</span> <span>id</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>job_id</span> <span style="color: #666;">INTEGER → jobs</span>
<span> </span> <span>cron_expression</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>enabled</span> <span style="color: #666;">BOOLEAN</span>
<span> </span> <span>created_at</span> <span style="color: #666;">DATETIME</span>
</div>
</div>
<!-- Job Executions -->
<div style="border: 2px solid #9C27B0; border-radius: 6px; padding: 12px; background: #faf0ff;">
<div style="font-weight: bold; color: #9C27B0; margin-bottom: 8px;">▶️ job_executions</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; gap: 4px 12px;">
<span style="color: #d32f2f;">PK</span> <span>id</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>job_id</span> <span style="color: #666;">INTEGER → jobs</span>
<span> </span> <span>status</span> <span style="color: #666;">TEXT (pending|running|success|failed|cancelled)</span>
<span> </span> <span>started_at</span> <span style="color: #666;">DATETIME</span>
<span> </span> <span>completed_at</span> <span style="color: #666;">DATETIME</span>
<span> </span> <span>bytes_processed</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>bytes_backed_up</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>error_message</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>triggered_by</span> <span style="color: #666;">TEXT (manual|schedule)</span>
</div>
</div>
<!-- Backups -->
<div style="border: 2px solid #607D8B; border-radius: 6px; padding: 12px; background: #f5f5f5;">
<div style="font-weight: bold; color: #607D8B; margin-bottom: 8px;">💾 backups</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; gap: 4px 12px;">
<span style="color: #d32f2f;">PK</span> <span>id</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>execution_id</span> <span style="color: #666;">INTEGER → job_executions</span>
<span> </span> <span>storage_path</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>size_bytes</span> <span style="color: #666;">INTEGER</span>
<span> </span> <span>checksum</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>type</span> <span style="color: #666;">TEXT (full|incremental)</span>
<span> </span> <span>parent_backup_id</span> <span style="color: #666;">INTEGER → backups (for incremental)</span>
<span> </span> <span>created_at</span> <span style="color: #666;">DATETIME</span>
</div>
</div>
<!-- Settings -->
<div style="border: 2px solid #795548; border-radius: 6px; padding: 12px; background: #faf5f0;">
<div style="font-weight: bold; color: #795548; margin-bottom: 8px;">⚙️ settings</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; gap: 4px 12px;">
<span style="color: #d32f2f;">PK</span> <span>key</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>value</span> <span style="color: #666;">TEXT</span>
<span> </span> <span>updated_at</span> <span style="color: #666;">DATETIME</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="section">
<h3>Key Relationships</h3>
<ul>
<li><strong>sources → jobs</strong>: One source can have many jobs (different backup strategies for the same data)</li>
<li><strong>jobs → schedules</strong>: One job can have one schedule (1:1 for simplicity)</li>
<li><strong>jobs → job_executions</strong>: One job has many executions over time</li>
<li><strong>job_executions → backups</strong>: Each execution produces one or more backup archives</li>
<li><strong>backups → backups</strong>: Self-referencing for incremental chain (parent_backup_id)</li>
</ul>
</div>
<div class="section">
<h3>Design Decisions</h3>
<div class="pros-cons">
<div class="pros">
<h4>Pros</h4>
<ul>
<li>Flexible source config via JSON (extensible for new source types)</li>
<li>Execution history tracking for audit and debugging</li>
<li>Incremental backup chain support</li>
<li>Simple key-value settings (easy to extend)</li>
</ul>
</div>
<div class="cons">
<h4>Cons>/h4>
<ul>
<li>JSON config loses some type safety (mitigated by validation)</li>
<li>No built-in backup retention policy table (can be added later)</li>
</ul>
</div>
</div>
</div>