- DB-Version auf 6 hochgezaehlt (Clean-Slate, keine Rueckwaertskompatibilitaet) - Alle manuellen Migrationen (v1-v5) aus Migrations.kt entfernt - DatabaseModule: addMigrations() durch fallbackToDestructiveMigration() ersetzt - migration-guide.md: AutoMigration-Workflow dokumentiert - Instrumentierte Tests: alte Migrationstests durch frische DB-Tests ersetzt - Schema 6.json exportiert Closes #89
4.3 KiB
Technology Candidates – DB-Migrationsstrategie
Date: 2026-05-17 Requirements file: requirements.md
Candidate Table
| Name | Beschreibung | Anwendung | Room-Version | Adoption | Req. Coverage | Score |
|---|---|---|---|---|---|---|
| A – Manuelle Migrations | Handgeschriebene Migration(X, Y) mit SQL |
Jede Schema-Änderung | 1.0+ | Widespread | Alle Must-Haves ✅ | 7 |
| B – Auto-Migration | Room generiert SQL aus @AutoMigration |
Einfache Änderungen | 2.4+ | Moderate | Alle Must-Haves ✅, limitiert bei Renames/Drops | 5 |
| C – Hybrid | Auto-Migration + manuelle Migration für Komplexes | Alle Fälle | 2.4+ | Moderate | Alle Must-Haves ✅, alle Should-Haves ✅ | 8 |
Candidate Details
A – Manuelle Room-Migrations
Beschreibung: Für jede Schema-Änderung wird ein Migration(X, Y)-Objekt in Migrations.kt geschrieben, das die SQL-Statements direkt enthält.
Requirement coverage:
- ✅ Must: Datenerhaltung, Room 2.6.1, testbar, rückwärtskompatibel, minSdk 26
- ✅ Should: Compile-time Validierung (Room prüft Schema), Checkliste vorhanden
- ⚠️ Missing: Kein reduzierter Boilerplate für einfache Fälle (ADD COLUMN braucht gleich viel Code wie Table-Rebuild)
Stärken:
- Volle Kontrolle über jeden SQL-Statement
- Kein "Magie"-Faktor – alles explizit und reviewbar
- Bewährt im Projekt (4 Migrationen funktionieren fehlerfrei)
- Funktioniert mit jeder SQLite-Version
Schwächen:
- Boilerplate: Selbst ein simples
ADD COLUMNbraucht ~15 Zeilen Code - Fehleranfällig: SQL-Typos werden erst zur Laufzeit entdeckt
- Table-Rebuild-Pattern für Renames/Drops ist aufwändig und repetitiv
Risiken: Gering. Ist der Status quo, bewährt, keine neuen Abhängigkeiten.
B – Auto-Migration (Room 2.4+)
Beschreibung: Room generiert Migrations-SQL automatisch aus dem Schema-Diff zwischen zwei @Database-Versionen. Konfiguriert über @AutoMigration(from = X, to = Y) direkt an der Database-Klasse.
Requirement coverage:
- ✅ Must: Datenerhaltung, Room 2.6.1, testbar, rückwärtskompatibel
- ⚠️ Must: minSdk 26 – Auto-Migration generiert intern Table-Rebuilds, aber Renames und Deletes erfordern
@AutoMigration.Specmit@RenameColumn/@DeleteColumnAnnotationen - ✅ Should: Minimaler Boilerplate für einfache Fälle
- ⚠️ Should: Eingeschränkt bei komplexen Fällen (Daten-Transformation, bedingte Migrationen)
Stärken:
- Null Boilerplate für einfache Fälle (ADD COLUMN, neue Tabelle)
- Compile-time Fehler wenn Schema-Diff nicht auflösbar
- Room generiert korrekten SQL für die jeweilige SQLite-Version
Schwächen:
- Kann nicht alle Fälle abdecken: Daten-Transformationen (z.B. Werte umrechnen), bedingte Logik, oder komplexe Multi-Tabellen-Migrationen sind unmöglich
- Rückblick auf bestehende Migrationen: 2 von 4 bestehenden Migrationen (V1→V2: Rename + Delete + Daten kopieren, V4→V5: Table-Rebuild) hätten Auto-Migration allein nicht bewältigt
- Auto-Migration als alleinige Strategie wäre für dieses Projekt unzureichend
Risiken: Hoch als Allein-Strategie. Mindestens 50% der bisherigen Migrationen wären nicht abbildbar gewesen.
C – Hybrid (Auto-Migration + Manuelle Fallbacks)
Beschreibung: Auto-Migration als Default für einfache Schema-Änderungen (ADD COLUMN, neue Tabellen). Manuelle Migration für alles Komplexe (Renames, Deletes, Daten-Transformationen). Klare Entscheidungsregeln, wann welcher Ansatz.
Requirement coverage:
- ✅ Must: Alle erfüllt
- ✅ Should: Reduzierter Boilerplate für einfache Fälle, Compile-time Validierung, klare Checkliste
- ✅ Nice: Automatische Schema-Diff-Generierung für einfache Fälle
Stärken:
- Best of both worlds: Wenig Code für einfache Fälle, volle Kontrolle für komplexe
- Bestehende manuelle Migrationen bleiben unverändert
- Klare Entscheidungsmatrix: "Ist es nur ADD COLUMN / neue Tabelle? → Auto. Sonst → Manuell."
- Room 2.6.1 unterstützt beides parallel
Schwächen:
- Leicht erhöhte kognitive Komplexität: Entwickler müssen wissen, wann welcher Ansatz
- Zwei Patterns im gleichen Projekt (aber mit klaren Regeln beherrschbar)
Risiken: Gering. Die Entscheidungsregel ist einfach und die migration-guide.md dokumentiert sie.