-- Änderungshistorie: die überschriebene Fassung eines Eintrags geht nicht -- mehr verloren. -- -- ── Warum? ─────────────────────────────────────────────────────────────────── -- -- entries.version zählt bei jeder Änderung hoch, aber der alte Inhalt wird -- nirgends aufgehoben. Überschreibt ein Agent etwas Richtiges mit etwas -- Falschem — oder ein Mensch verwechselt sich beim Bearbeiten —, ist das -- Richtige weg, ohne Wiederherstellungsweg. -- -- ── Aufbau ─────────────────────────────────────────────────────────────────── -- -- entries bleibt die aktuelle Fassung. entry_versions hält die SUPERSEDED -- Fassungen: bei jedem Schreibvorgang, der eine bestehende Zeile ändert (nicht -- beim erstmaligen Anlegen), wird der bisherige Stand hier abgelegt, bevor er -- überschrieben wird. version trägt dabei die Nummer, die die Fassung VOR der -- Änderung hatte — Fassung 1 ist also das, was durch das Schreiben zu Fassung 2 -- wurde. -- -- Schlagworte stehen hier bewusst als kommagetrennter Text statt in einer -- eigenen Tabelle wie bei entries/entry_tags: Eine historische Fassung wird nie -- gefiltert oder durchsucht, sie wird nur ganz gelesen — eine Nebentabelle -- brächte dafür keinen Nutzen, nur eine weitere Stelle, die beim Schreiben -- mitgepflegt werden müsste. CREATE TABLE entry_versions ( id TEXT PRIMARY KEY, entry_id TEXT NOT NULL REFERENCES entries(id) ON DELETE CASCADE, project_id TEXT NOT NULL, version INTEGER NOT NULL, title TEXT NOT NULL, content TEXT NOT NULL, tags TEXT NOT NULL DEFAULT '', author TEXT NOT NULL DEFAULT '', source TEXT NOT NULL, curated INTEGER NOT NULL DEFAULT 0, -- Zeitpunkt, zu dem diese Fassung abgelöst wurde — nicht, wann sie -- entstand (das wüssten wir hier nicht mehr, ohne die Kette rückwärts -- aufzurollen; für die Historie reicht "abgelöst am"). created_at TEXT NOT NULL, UNIQUE (entry_id, version) ); CREATE INDEX idx_entry_versions_entry ON entry_versions (entry_id, version);