fix(docs/storage): resolve FLAW-02, remove unused docDir and update documentation for pure database architecture
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 39s

This commit is contained in:
sandrodach committed 2026-10-26 14:31:54 +01:00
1 parent 3480859d8a
commit 0bdeb5f320
7 files changed
+42 -52

No files matched your search

+20 -17
View File
@@ -1,6 +1,6 @@
# 📝 Kernmodul 3: Workspace Outliner-Engine, Wiki-Links & Disk-Sync
# 📝 Kernmodul 3: Workspace Outliner-Engine, Wiki-Links & Pure-DB Storage
Der MindSift Workspace ([`WorkspaceView.tsx`](../../frontend/src/features/workspace/WorkspaceView.tsx)) kombiniert ein **hierarchisches Bullet-Point Notizsystem (inspiriert von Logseq)** mit einem **persönlichen Markdown-Wiki** und einem **globalen To-Do Rollup Dashboard**.
Der MindSift Workspace ([`WorkspaceView.tsx`](../../frontend/src/features/workspace/WorkspaceView.tsx)) kombiniert ein **hierarchisches Bullet-Point Notizsystem (inspiriert von Logseq)** mit einem **persönlichen Wiki** und einem **globalen To-Do Rollup Dashboard**.
---
@@ -46,30 +46,33 @@ Der Bullet-Dot dient gleichzeitig als Drag-Anfasser. Wird ein Block verschoben,
---
## 💾 3. Dual-Storage: Database-First & Disk-Mirroring
## 💾 3. Pure-Database Architecture (Keine MD-Dateien auf Platte)
MindSift löst das Dilemma zwischen schneller relationaler Abfrage und portabler Dateispeicherung durch ein **synchrones Dual-Storage-Modell**:
MindSift speichert Notizen und Outliner-Bäume **zu 100% relational in SQLite**. Es werden bewusst **keine Markdown-Dateien auf dem Dateisystem** abgelegt:
```
Client (Block-Editor)
│ PATCH /api/v1/documents/:id/blocks
│ PUT /api/v1/documents/:id/blocks (oder WebSocket)
▼
Backend Engine
┌──────────────────────────────────────────────┐
│ 1. Transaktion in SQLite (document_blocks) │
│ -> Sort-Order, Content, Level, Checked │
│ 2. Volltext-Generierung (Markdown-String) │
│ 3. Schreiben auf Disk (/data/workspace/...) │
│ Atomare Transaktion in SQLite: │
│ 1. DELETE FROM document_blocks WHERE doc_id │
│ 2. Batch INSERT der Blöcke: │
│ -> id, doc_id, content, level, checked, │
│ sort_order, collapsed │
│ 3. WebSocket Broadcast an Raum (doc:id) │
└──────────────────────────────────────────────┘
```
1. **Präzision & Geschwindigkeit (SQLite):**
- Jeder Block besitzt eine eindeutige ID (`blk_...`) und eine Gleitkomma-Reihenfolge (`sort_order REAL`).
- Schnelle Status-Updates (z.B. Checkbox abhaken) schreiben nur genau eine Zeile in die Datenbank.
2. **Datensouveränität & Portabilität (Disk-Mirror):**
- Zeitgleich spiegelt der Server das Dokument als Standard-`.md`-Datei unter `/data/workspace/<user_id>/<ordner>/<dateiname>.md`.
- Einrückungen werden nach dem 2-Leerzeichen-Standard (` - [ ] `) formatiert.
- Administratoren können das Verzeichnis jederzeit mit externen Werkzeugen (Obsidian, Logseq, Git, rsync) sichern.
### Vorteile der reinen Datenbank-Architektur
1. **Kein Dual-Storage & kein Drift:**
- Keine Inkonsistenzen zwischen Festplattendateien und Datenbankzeilen.
- Keine Dateisystem-Sperren, Race-Conditions oder Berechtigungskonflikte auf Betriebssystemebene.
2. **Atomare Transaktionen (ACID):**
- Strukturänderungen (Einrücken, Unterbaum verschieben, Blöcke löschen) sind atomar in einer Transaktion gekapselt.
3. **Skalierbare Abfragen & Rollups:**
- Aggregationen (wie das globale To-Do Dashboard oder Tag-Suchen) erfolgen mit hochoptimierten SQL-Abfragen über relationale Indizes, anstatt Hunderte `.md`-Dateien von der Festplatte parsen zu müssen.
---
@@ -79,4 +82,4 @@ Client (Block-Editor)
- Scannt in Echtzeit alle unvollendeten `- [ ] ` Checkboxen über alle Ordner und Notizen hinweg.
- Übersichtliche Gruppierung nach **Ordner ➔ Dokument ➔ Aufgabe**.
- **Ordner-Filter:** Klick auf einen Ordner isoliert nur dessen Aufgaben für fokussiertes Arbeiten.
- **2-Wege-Live-Sync:** Wird eine Checkbox im Rollup abgehakt, wird der Block in SQLite sofort auf `checked = 1` aktualisiert und die physische `.md`-Datei synchronisiert.
- **2-Wege-Live-Sync:** Wird eine Checkbox im Rollup abgehakt, wird der Block in SQLite sofort auf `checked = 1` aktualisiert und via WebSocket an alle aktiven Clients gebroadcastet.