refactor(db): Complete Database Schema Redesign with Data Migration #197

Closed
opened 2026-01-24 17:05:50 +00:00 by jack · 1 comment
Owner

Zusammenfassung

Komplette Überarbeitung der Datenbank-Struktur mit sauberer Migration der bestehenden ~12.000 Observations und aller anderen Daten.


Aktuelle Probleme

Schema-Entity Drift (Kritisch)

Problem Betroffene Entity Details
Fehlende Spalten in DB Session repo_path, is_worktree, branch in Entity definiert aber nicht in DB
Fehlende Spalten in DB Observation repo_path in Entity definiert aber nicht in DB
Deprecated Spalten Observation concept, source_files in Entity aber nicht in DB
Fehlende Entity-Klasse repositories Tabelle existiert, aber keine TypeScript Entity
Komplett out-of-sync PendingMessage DB-Schema und Entity stimmen fast gar nicht überein
Fehlende Felder in Entity Summary files_read, files_edited, notes in DB aber nicht in Entity

Naming-Inkonsistenzen

Aktuell Problem
sdk_sessions Prefix sdk_ unnötig
session_summaries Inkonsistent mit anderen Tabellen
project_claudemd Kein Plural, unklarer Name
cwd vs working_directory Abkürzung vs ausgeschrieben
user_prompts Könnte kürzer sein

Fehlende Foreign Keys

  • documents.observation_idobservations.id
  • documents.memory_session_idsessions
  • project_claudemd.memory_session_idsessions

Unvollständige Migration

Migration 20260124000001_GitWorktreeSupport scheint nicht vollständig angewendet worden zu sein.


Neue Schema-Struktur

1. sessions (vorher sdk_sessions)

CREATE TABLE sessions (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  content_session_id TEXT NOT NULL UNIQUE,
  memory_session_id TEXT,
  project TEXT NOT NULL,
  user_prompt TEXT,
  working_directory TEXT,
  repo_path TEXT,
  is_worktree INTEGER DEFAULT 0,
  branch TEXT,
  started_at TEXT NOT NULL,
  started_at_epoch INTEGER NOT NULL,
  completed_at TEXT,
  completed_at_epoch INTEGER,
  status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'failed')),
  worker_port INTEGER,
  prompt_counter INTEGER DEFAULT 0
);

2. observations (überarbeitet)

CREATE TABLE observations (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  memory_session_id TEXT NOT NULL,
  project TEXT NOT NULL,
  type TEXT NOT NULL CHECK(type IN ('decision', 'bugfix', 'feature', 'refactor', 'discovery', 'change', 'session-request')),
  title TEXT,
  subtitle TEXT,
  text TEXT,
  narrative TEXT,
  concepts TEXT,  -- JSON array
  facts TEXT,     -- JSON array
  files_read TEXT,     -- JSON array
  files_modified TEXT, -- JSON array
  git_branch TEXT,
  working_directory TEXT,  -- vorher cwd
  repo_path TEXT,
  prompt_number INTEGER,
  discovery_tokens INTEGER,
  created_at TEXT NOT NULL,
  created_at_epoch INTEGER NOT NULL,
  
  FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE CASCADE
);

3. summaries (vorher session_summaries)

CREATE TABLE summaries (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  memory_session_id TEXT NOT NULL,
  project TEXT NOT NULL,
  request TEXT,
  investigated TEXT,
  learned TEXT,
  completed TEXT,
  next_steps TEXT,
  files_read TEXT,    -- JSON array
  files_edited TEXT,  -- JSON array
  notes TEXT,
  prompt_number INTEGER,
  discovery_tokens INTEGER,
  created_at TEXT NOT NULL,
  created_at_epoch INTEGER NOT NULL,
  
  FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE CASCADE
);

4. prompts (vorher user_prompts)

CREATE TABLE prompts (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  content_session_id TEXT NOT NULL,
  prompt_number INTEGER NOT NULL,
  prompt_text TEXT NOT NULL,
  created_at TEXT NOT NULL,
  created_at_epoch INTEGER NOT NULL,
  
  UNIQUE(content_session_id, prompt_number),
  FOREIGN KEY (content_session_id) REFERENCES sessions(content_session_id) ON DELETE CASCADE
);

5. tasks (vorher task_queue)

CREATE TABLE tasks (
  id TEXT PRIMARY KEY,
  type TEXT NOT NULL,
  status TEXT NOT NULL DEFAULT 'pending',
  required_capability TEXT NOT NULL,
  fallback_capabilities TEXT,
  priority INTEGER DEFAULT 0,
  payload TEXT NOT NULL,
  result TEXT,
  error TEXT,
  retry_count INTEGER DEFAULT 0,
  max_retries INTEGER DEFAULT 3,
  assigned_worker_id TEXT,
  created_at INTEGER NOT NULL,
  assigned_at INTEGER,
  completed_at INTEGER
);

6. claudemd (vorher project_claudemd)

CREATE TABLE claudemd (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  project TEXT NOT NULL,
  content TEXT NOT NULL,
  content_session_id TEXT NOT NULL,
  memory_session_id TEXT,
  working_directory TEXT,
  generated_at INTEGER NOT NULL,
  tokens INTEGER DEFAULT 0,
  
  UNIQUE(project, content_session_id),
  FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE SET NULL
);

7. documents (überarbeitet)

CREATE TABLE documents (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  project TEXT NOT NULL,
  source TEXT NOT NULL,
  source_tool TEXT NOT NULL,
  title TEXT,
  content TEXT NOT NULL,
  content_hash TEXT NOT NULL UNIQUE,
  type TEXT DEFAULT 'library-docs',
  metadata TEXT,
  memory_session_id TEXT,
  observation_id INTEGER,
  access_count INTEGER DEFAULT 1,
  last_accessed_epoch INTEGER NOT NULL,
  created_at TEXT NOT NULL,
  created_at_epoch INTEGER NOT NULL,
  
  FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE SET NULL,
  FOREIGN KEY (observation_id) REFERENCES observations(id) ON DELETE SET NULL
);

8. repositories (neu)

CREATE TABLE repositories (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  repo_path TEXT NOT NULL UNIQUE,
  remote_url TEXT,
  name TEXT NOT NULL,
  created_at INTEGER NOT NULL,
  last_seen_at INTEGER NOT NULL
);

9. pending_messagesENTFERNEN


Migration-Strategie

Phase 1: Backup

cp ~/.claude-mem/claude-mem.db ~/.claude-mem/claude-mem.db.backup-$(date +%Y%m%d)

Phase 2: Entity-Klassen aktualisieren

  1. Tabellennamen ändern:

    @Entity({ tableName: 'sessions' })      // vorher 'sdk_sessions'
    @Entity({ tableName: 'summaries' })     // vorher 'session_summaries'
    @Entity({ tableName: 'prompts' })       // vorher 'user_prompts'
    @Entity({ tableName: 'tasks' })         // vorher 'task_queue'
    @Entity({ tableName: 'claudemd' })      // vorher 'project_claudemd'
    
  2. Spalten umbenennen:

    @Property({ fieldName: 'working_directory' })  // vorher 'cwd'
    workingDirectory?: string;
    
  3. Neue Entity erstellen: Repository.ts

  4. Legacy Entity entfernen: PendingMessage.ts

Phase 3: Migration mit MikroORM CLI generieren

cd packages/database

# Migration aus Entity-Änderungen generieren
npx mikro-orm migration:create --name=schema_redesign

# Output:
# Migration20260125000001_schema_redesign.ts successfully created

# Pending Migrations anzeigen
npx mikro-orm migration:pending

WICHTIG: Die generierte Migration enthält nur Schema-Änderungen. Da wir Tabellen umbenennen und Daten migrieren müssen, muss die Migration manuell angepasst werden!

Phase 4: Generierte Migration anpassen

Die automatisch generierte Migration muss um Daten-Migrationen erweitert werden:

// Migration20260125000001_schema_redesign.ts
import { Migration } from '@mikro-orm/migrations';

export class Migration20260125000001_schema_redesign extends Migration {
  override async up(): Promise<void> {
    // 1. Neue Tabellen erstellen (wird von MikroORM generiert)
    this.addSql(`CREATE TABLE sessions (...)`);
    
    // 2. Daten von alten zu neuen Tabellen migrieren (MANUELL HINZUFÜGEN)
    this.addSql(`
      INSERT INTO sessions 
      SELECT * FROM sdk_sessions
    `);
    
    this.addSql(`
      INSERT INTO observations_new (
        id, memory_session_id, project, type, title, subtitle, text, narrative,
        concepts, facts, files_read, files_modified, git_branch,
        working_directory, repo_path, prompt_number, discovery_tokens,
        created_at, created_at_epoch
      )
      SELECT 
        id, memory_session_id, project, type, title, subtitle, text, narrative,
        concepts, facts, files_read, files_modified, git_branch,
        cwd,  -- Umbenennung: cwd → working_directory
        NULL,
        prompt_number, discovery_tokens,
        created_at, created_at_epoch
      FROM observations
    `);
    
    // 3. Alte Tabellen droppen
    this.addSql(`DROP TABLE sdk_sessions`);
    this.addSql(`DROP TABLE pending_messages`);
    
    // 4. FTS5 Indexes neu erstellen
    this.addSql(`
      CREATE VIRTUAL TABLE observations_fts USING fts5(
        title, text, narrative, concepts, facts,
        content='observations',
        content_rowid='id'
      )
    `);
  }

  override async down(): Promise<void> {
    // Reverse migration...
  }
}

Phase 5: Migration ausführen

# Migration anwenden
npx mikro-orm migration:up

# Output:
# Processing 'Migration20260125000001_schema_redesign'
# Applied 'Migration20260125000001_schema_redesign'
# Successfully migrated up to the latest version

# Alle ausgeführten Migrations auflisten
npx mikro-orm migration:list

# ┌───────────────────────────────────────────┬──────────────────────────┐
# │ Name                                      │ Executed at              │
# ├───────────────────────────────────────────┼──────────────────────────┤
# │ Migration20260125000001_schema_redesign   │ 2026-01-25T12:00:00.000Z │
# └───────────────────────────────────────────┴──────────────────────────┘

Phase 6: Code-Anpassungen

  • Alle Referenzen auf alte Tabellennamen aktualisieren
  • cwdworkingDirectory im gesamten Code
  • Repository-Namen anpassen (z.B. UserPromptRepositoryPromptRepository)

MikroORM CLI Referenz

Befehl Beschreibung
npx mikro-orm migration:create Erstellt Migration mit aktuellem Schema-Diff
npx mikro-orm migration:create --name=NAME Migration mit custom Name erstellen
npx mikro-orm migration:create --blank Leere Migration erstellen
npx mikro-orm migration:up Alle pending Migrations ausführen
npx mikro-orm migration:down Einen Schritt zurück migrieren
npx mikro-orm migration:list Alle ausgeführten Migrations auflisten
npx mikro-orm migration:pending Alle pending Migrations auflisten
npx mikro-orm migration:check Prüfen ob Migrations nötig sind

Akzeptanzkriterien

  • Alle ~12.000 Observations erfolgreich migriert
  • Alle Sessions mit korrekten Referenzen
  • Keine Schema-Entity Drift mehr
  • Alle Foreign Keys funktional
  • FTS5 Volltextsuche funktioniert
  • Alle Unit-Tests grün
  • WebUI funktioniert wie vorher
  • Backup-Restore-Prozedur dokumentiert

Risiken

Risiko Mitigation
Datenverlust Backup vor Migration
Downtime Migration in Maintenance-Window
Performance Indexes sorgfältig planen
Breaking Changes Alle Code-Referenzen vorher identifizieren

Geschätzter Aufwand

Phase Aufwand
Backup & Vorbereitung 2h
Entity-Klassen Update 4h
Migration mit CLI generieren 1h
Migration anpassen (Daten-Migration) 6h
Code-Anpassungen 6h
Testing 4h
Dokumentation 2h
Gesamt ~25h
## Zusammenfassung Komplette Überarbeitung der Datenbank-Struktur mit sauberer Migration der bestehenden ~12.000 Observations und aller anderen Daten. --- ## Aktuelle Probleme ### Schema-Entity Drift (Kritisch) | Problem | Betroffene Entity | Details | |---------|-------------------|---------| | **Fehlende Spalten in DB** | `Session` | `repo_path`, `is_worktree`, `branch` in Entity definiert aber nicht in DB | | **Fehlende Spalten in DB** | `Observation` | `repo_path` in Entity definiert aber nicht in DB | | **Deprecated Spalten** | `Observation` | `concept`, `source_files` in Entity aber nicht in DB | | **Fehlende Entity-Klasse** | `repositories` | Tabelle existiert, aber keine TypeScript Entity | | **Komplett out-of-sync** | `PendingMessage` | DB-Schema und Entity stimmen fast gar nicht überein | | **Fehlende Felder in Entity** | `Summary` | `files_read`, `files_edited`, `notes` in DB aber nicht in Entity | ### Naming-Inkonsistenzen | Aktuell | Problem | |---------|---------| | `sdk_sessions` | Prefix `sdk_` unnötig | | `session_summaries` | Inkonsistent mit anderen Tabellen | | `project_claudemd` | Kein Plural, unklarer Name | | `cwd` vs `working_directory` | Abkürzung vs ausgeschrieben | | `user_prompts` | Könnte kürzer sein | ### Fehlende Foreign Keys - `documents.observation_id` → `observations.id` - `documents.memory_session_id` → `sessions` - `project_claudemd.memory_session_id` → `sessions` ### Unvollständige Migration Migration `20260124000001_GitWorktreeSupport` scheint nicht vollständig angewendet worden zu sein. --- ## Neue Schema-Struktur ### 1. `sessions` (vorher `sdk_sessions`) ```sql CREATE TABLE sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, content_session_id TEXT NOT NULL UNIQUE, memory_session_id TEXT, project TEXT NOT NULL, user_prompt TEXT, working_directory TEXT, repo_path TEXT, is_worktree INTEGER DEFAULT 0, branch TEXT, started_at TEXT NOT NULL, started_at_epoch INTEGER NOT NULL, completed_at TEXT, completed_at_epoch INTEGER, status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'failed')), worker_port INTEGER, prompt_counter INTEGER DEFAULT 0 ); ``` ### 2. `observations` (überarbeitet) ```sql CREATE TABLE observations ( id INTEGER PRIMARY KEY AUTOINCREMENT, memory_session_id TEXT NOT NULL, project TEXT NOT NULL, type TEXT NOT NULL CHECK(type IN ('decision', 'bugfix', 'feature', 'refactor', 'discovery', 'change', 'session-request')), title TEXT, subtitle TEXT, text TEXT, narrative TEXT, concepts TEXT, -- JSON array facts TEXT, -- JSON array files_read TEXT, -- JSON array files_modified TEXT, -- JSON array git_branch TEXT, working_directory TEXT, -- vorher cwd repo_path TEXT, prompt_number INTEGER, discovery_tokens INTEGER, created_at TEXT NOT NULL, created_at_epoch INTEGER NOT NULL, FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE CASCADE ); ``` ### 3. `summaries` (vorher `session_summaries`) ```sql CREATE TABLE summaries ( id INTEGER PRIMARY KEY AUTOINCREMENT, memory_session_id TEXT NOT NULL, project TEXT NOT NULL, request TEXT, investigated TEXT, learned TEXT, completed TEXT, next_steps TEXT, files_read TEXT, -- JSON array files_edited TEXT, -- JSON array notes TEXT, prompt_number INTEGER, discovery_tokens INTEGER, created_at TEXT NOT NULL, created_at_epoch INTEGER NOT NULL, FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE CASCADE ); ``` ### 4. `prompts` (vorher `user_prompts`) ```sql CREATE TABLE prompts ( id INTEGER PRIMARY KEY AUTOINCREMENT, content_session_id TEXT NOT NULL, prompt_number INTEGER NOT NULL, prompt_text TEXT NOT NULL, created_at TEXT NOT NULL, created_at_epoch INTEGER NOT NULL, UNIQUE(content_session_id, prompt_number), FOREIGN KEY (content_session_id) REFERENCES sessions(content_session_id) ON DELETE CASCADE ); ``` ### 5. `tasks` (vorher `task_queue`) ```sql CREATE TABLE tasks ( id TEXT PRIMARY KEY, type TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'pending', required_capability TEXT NOT NULL, fallback_capabilities TEXT, priority INTEGER DEFAULT 0, payload TEXT NOT NULL, result TEXT, error TEXT, retry_count INTEGER DEFAULT 0, max_retries INTEGER DEFAULT 3, assigned_worker_id TEXT, created_at INTEGER NOT NULL, assigned_at INTEGER, completed_at INTEGER ); ``` ### 6. `claudemd` (vorher `project_claudemd`) ```sql CREATE TABLE claudemd ( id INTEGER PRIMARY KEY AUTOINCREMENT, project TEXT NOT NULL, content TEXT NOT NULL, content_session_id TEXT NOT NULL, memory_session_id TEXT, working_directory TEXT, generated_at INTEGER NOT NULL, tokens INTEGER DEFAULT 0, UNIQUE(project, content_session_id), FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE SET NULL ); ``` ### 7. `documents` (überarbeitet) ```sql CREATE TABLE documents ( id INTEGER PRIMARY KEY AUTOINCREMENT, project TEXT NOT NULL, source TEXT NOT NULL, source_tool TEXT NOT NULL, title TEXT, content TEXT NOT NULL, content_hash TEXT NOT NULL UNIQUE, type TEXT DEFAULT 'library-docs', metadata TEXT, memory_session_id TEXT, observation_id INTEGER, access_count INTEGER DEFAULT 1, last_accessed_epoch INTEGER NOT NULL, created_at TEXT NOT NULL, created_at_epoch INTEGER NOT NULL, FOREIGN KEY (memory_session_id) REFERENCES sessions(memory_session_id) ON DELETE SET NULL, FOREIGN KEY (observation_id) REFERENCES observations(id) ON DELETE SET NULL ); ``` ### 8. `repositories` (neu) ```sql CREATE TABLE repositories ( id INTEGER PRIMARY KEY AUTOINCREMENT, repo_path TEXT NOT NULL UNIQUE, remote_url TEXT, name TEXT NOT NULL, created_at INTEGER NOT NULL, last_seen_at INTEGER NOT NULL ); ``` ### 9. `pending_messages` → **ENTFERNEN** --- ## Migration-Strategie ### Phase 1: Backup ```bash cp ~/.claude-mem/claude-mem.db ~/.claude-mem/claude-mem.db.backup-$(date +%Y%m%d) ``` ### Phase 2: Entity-Klassen aktualisieren 1. **Tabellennamen ändern:** ```typescript @Entity({ tableName: 'sessions' }) // vorher 'sdk_sessions' @Entity({ tableName: 'summaries' }) // vorher 'session_summaries' @Entity({ tableName: 'prompts' }) // vorher 'user_prompts' @Entity({ tableName: 'tasks' }) // vorher 'task_queue' @Entity({ tableName: 'claudemd' }) // vorher 'project_claudemd' ``` 2. **Spalten umbenennen:** ```typescript @Property({ fieldName: 'working_directory' }) // vorher 'cwd' workingDirectory?: string; ``` 3. **Neue Entity erstellen:** `Repository.ts` 4. **Legacy Entity entfernen:** `PendingMessage.ts` ### Phase 3: Migration mit MikroORM CLI generieren ```bash cd packages/database # Migration aus Entity-Änderungen generieren npx mikro-orm migration:create --name=schema_redesign # Output: # Migration20260125000001_schema_redesign.ts successfully created # Pending Migrations anzeigen npx mikro-orm migration:pending ``` > **WICHTIG:** Die generierte Migration enthält nur Schema-Änderungen. Da wir Tabellen umbenennen und Daten migrieren müssen, muss die Migration **manuell angepasst** werden! ### Phase 4: Generierte Migration anpassen Die automatisch generierte Migration muss um Daten-Migrationen erweitert werden: ```typescript // Migration20260125000001_schema_redesign.ts import { Migration } from '@mikro-orm/migrations'; export class Migration20260125000001_schema_redesign extends Migration { override async up(): Promise<void> { // 1. Neue Tabellen erstellen (wird von MikroORM generiert) this.addSql(`CREATE TABLE sessions (...)`); // 2. Daten von alten zu neuen Tabellen migrieren (MANUELL HINZUFÜGEN) this.addSql(` INSERT INTO sessions SELECT * FROM sdk_sessions `); this.addSql(` INSERT INTO observations_new ( id, memory_session_id, project, type, title, subtitle, text, narrative, concepts, facts, files_read, files_modified, git_branch, working_directory, repo_path, prompt_number, discovery_tokens, created_at, created_at_epoch ) SELECT id, memory_session_id, project, type, title, subtitle, text, narrative, concepts, facts, files_read, files_modified, git_branch, cwd, -- Umbenennung: cwd → working_directory NULL, prompt_number, discovery_tokens, created_at, created_at_epoch FROM observations `); // 3. Alte Tabellen droppen this.addSql(`DROP TABLE sdk_sessions`); this.addSql(`DROP TABLE pending_messages`); // 4. FTS5 Indexes neu erstellen this.addSql(` CREATE VIRTUAL TABLE observations_fts USING fts5( title, text, narrative, concepts, facts, content='observations', content_rowid='id' ) `); } override async down(): Promise<void> { // Reverse migration... } } ``` ### Phase 5: Migration ausführen ```bash # Migration anwenden npx mikro-orm migration:up # Output: # Processing 'Migration20260125000001_schema_redesign' # Applied 'Migration20260125000001_schema_redesign' # Successfully migrated up to the latest version # Alle ausgeführten Migrations auflisten npx mikro-orm migration:list # ┌───────────────────────────────────────────┬──────────────────────────┐ # │ Name │ Executed at │ # ├───────────────────────────────────────────┼──────────────────────────┤ # │ Migration20260125000001_schema_redesign │ 2026-01-25T12:00:00.000Z │ # └───────────────────────────────────────────┴──────────────────────────┘ ``` ### Phase 6: Code-Anpassungen - Alle Referenzen auf alte Tabellennamen aktualisieren - `cwd` → `workingDirectory` im gesamten Code - Repository-Namen anpassen (z.B. `UserPromptRepository` → `PromptRepository`) --- ## MikroORM CLI Referenz | Befehl | Beschreibung | |--------|--------------| | `npx mikro-orm migration:create` | Erstellt Migration mit aktuellem Schema-Diff | | `npx mikro-orm migration:create --name=NAME` | Migration mit custom Name erstellen | | `npx mikro-orm migration:create --blank` | Leere Migration erstellen | | `npx mikro-orm migration:up` | Alle pending Migrations ausführen | | `npx mikro-orm migration:down` | Einen Schritt zurück migrieren | | `npx mikro-orm migration:list` | Alle ausgeführten Migrations auflisten | | `npx mikro-orm migration:pending` | Alle pending Migrations auflisten | | `npx mikro-orm migration:check` | Prüfen ob Migrations nötig sind | --- ## Akzeptanzkriterien - [ ] Alle ~12.000 Observations erfolgreich migriert - [ ] Alle Sessions mit korrekten Referenzen - [ ] Keine Schema-Entity Drift mehr - [ ] Alle Foreign Keys funktional - [ ] FTS5 Volltextsuche funktioniert - [ ] Alle Unit-Tests grün - [ ] WebUI funktioniert wie vorher - [ ] Backup-Restore-Prozedur dokumentiert --- ## Risiken | Risiko | Mitigation | |--------|------------| | Datenverlust | Backup vor Migration | | Downtime | Migration in Maintenance-Window | | Performance | Indexes sorgfältig planen | | Breaking Changes | Alle Code-Referenzen vorher identifizieren | --- ## Geschätzter Aufwand | Phase | Aufwand | |-------|---------| | Backup & Vorbereitung | 2h | | Entity-Klassen Update | 4h | | Migration mit CLI generieren | 1h | | Migration anpassen (Daten-Migration) | 6h | | Code-Anpassungen | 6h | | Testing | 4h | | Dokumentation | 2h | | **Gesamt** | **~25h** |
Author
Owner

Abgeschlossen

Commits

  • 510a3d6 refactor(database): complete schema redesign (#197)
  • 9ceb76f fix(database): update raw SQL to use new table names
  • 7cdff9a feat(database): add MikroORM relations for FK relationships
  • 44885ee feat(database): add FTS5 full-text search and repositories table

Änderungen

Tabellen umbenannt:

Alt Neu
sdk_sessions sessions
session_summaries summaries
user_prompts prompts
task_queue tasks
project_claudemd claudemd

Spalte umbenannt:

  • observations.cwdobservations.working_directory

Entfernt:

  • PendingMessage Entity und Tabelle (unbenutzt)
  • 17 alte Migrationen → 1 konsolidierte Initial-Migration

Hinzugefügt:

  • MikroORM Relations für FK-Beziehungen (CodeSnippet, Document, ObservationLink → Observation)
  • FTS5 Virtual Tables mit Sync-Triggers (observations_fts, documents_fts)
  • Repository Entity und Tabelle

Hinweis

Die alte Datenbank wurde archiviert (~/.claude-mem/claude-mem.db.archive-20260125). Keine Daten-Migration durchgeführt - neue DB mit sauberem Schema erstellt.

## Abgeschlossen ### Commits - `510a3d6` refactor(database): complete schema redesign (#197) - `9ceb76f` fix(database): update raw SQL to use new table names - `7cdff9a` feat(database): add MikroORM relations for FK relationships - `44885ee` feat(database): add FTS5 full-text search and repositories table ### Änderungen **Tabellen umbenannt:** | Alt | Neu | |-----|-----| | `sdk_sessions` | `sessions` | | `session_summaries` | `summaries` | | `user_prompts` | `prompts` | | `task_queue` | `tasks` | | `project_claudemd` | `claudemd` | **Spalte umbenannt:** - `observations.cwd` → `observations.working_directory` **Entfernt:** - `PendingMessage` Entity und Tabelle (unbenutzt) - 17 alte Migrationen → 1 konsolidierte Initial-Migration **Hinzugefügt:** - MikroORM Relations für FK-Beziehungen (CodeSnippet, Document, ObservationLink → Observation) - FTS5 Virtual Tables mit Sync-Triggers (`observations_fts`, `documents_fts`) - `Repository` Entity und Tabelle ### Hinweis Die alte Datenbank wurde archiviert (`~/.claude-mem/claude-mem.db.archive-20260125`). Keine Daten-Migration durchgeführt - neue DB mit sauberem Schema erstellt.
jack closed this issue 2026-01-25 10:11:33 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
customable/claude-mem#197
No description provided.