# Datenbank-Schema-Updates ## Problem Sequelize erstellt bei jedem `sync()` mit `alter: true` die Constraints neu, was zu Duplikaten und Problemen führen kann. ## Lösung ### 1. Intelligente Schema-Synchronisation (Standard) ```javascript // In utils/sequelize.js - syncModelsWithUpdates() // Prüft automatisch ob Schema-Updates nötig sind // Verwendet alter: true nur bei Bedarf await syncModelsWithUpdates(models); ``` - **Automatische Erkennung** von Schema-Updates - **alter: true nur bei Bedarf** - verhindert Duplikate - **Fallback** zu alter: false wenn keine Updates nötig - **Sicher und effizient** ### 2. Normale Synchronisation (ohne Updates) ```javascript // In utils/sequelize.js - syncModels() await model.sync({ alter: false, force: false }); ``` - **Keine Schema-Änderungen** - **Keine Constraints werden neu erstellt** - **Schnell und sicher** ### 3. Manuelle Schema-Updates (nur bei Bedarf) ```javascript // In utils/sequelize.js - updateSchema() await model.sync({ alter: true, force: false }); ``` - **Nur bei expliziten Schema-Änderungen verwenden** - **Kann zu Duplikaten führen** - **Nach Update: Zurück zu intelligenter Synchronisation** ### 4. Vollständiger Reset (nur in Entwicklung) ```javascript await model.sync({ force: true }); ``` - **Löscht alle Daten!** - **Nur in Entwicklungsumgebung verwenden** ## Aktuelle Implementierung ### Intelligente Synchronisation ```javascript // syncModelsWithUpdates() prüft automatisch: // 1. Alle verfügbaren Schemas (community, falukant_data, match3, etc.) // 2. Alle Tabellen in jedem Schema // 3. Alle Spalten in jeder Tabelle // 4. Datentypen, Constraints und Standardwerte // 5. Verwendet alter: true nur wenn nötig ``` ### Universelle Schema-Prüfung ```javascript // checkSchemaUpdates() prüft alle Schemas: // - community (Benutzer, Rechte, etc.) // - falukant_data (Spieldaten) // - falukant_type (Spieltypen) // - falukant_predefine (Vordefinierte Daten) // - falukant_log (Spiel-Logs) // - chat (Chat-System) // - forum (Forum-System) // - match3 (Match3-Spiel) // - logs (Allgemeine Logs) // - type (Allgemeine Typen) // - service (Service-Daten) ``` ### Detaillierte Tabellen-Prüfung ```javascript // checkTableForUpdates() prüft jede Tabelle: // - Fehlende Spalten // - Neue Spalten // - Geänderte Spalten // - Model-zu-Tabelle-Zuordnung ``` ### Umfassende Spalten-Prüfung ```javascript // checkColumnForUpdates() prüft jede Spalte: // - Datentyp-Änderungen (INTEGER → BIGINT) // - NULL/NOT NULL Constraints // - Standardwerte // - Längen-Änderungen (VARCHAR) ``` ## Workflow für Schema-Updates ### Schritt 1: Schema ändern ```javascript // In models/.../model.js // Neue Felder, Constraints, etc. hinzufügen ``` ### Schritt 2: Automatische Erkennung ```javascript // syncModelsWithUpdates() erkennt automatisch: // - Welche Updates nötig sind // - Verwendet alter: true nur bei Bedarf // - Läuft bei jedem Start sicher ``` ### Schritt 3: Keine manuellen Änderungen nötig ```javascript // Die intelligente Synchronisation: // - Erkennt Änderungen automatisch // - Wendet sie sicher an // - Verhindert Duplikate ``` ## Constraint-Bereinigung ### Analyse ausführen ```bash cd backend node utils/cleanupDatabaseConstraints.js ``` ### Manuelle Bereinigung ```sql -- Doppelte Foreign Keys entfernen ALTER TABLE schema.table_name DROP CONSTRAINT constraint_name; -- Doppelte Indexe entfernen DROP INDEX IF EXISTS index_name; ``` ## Best Practices 1. **Intelligente Synchronisation verwenden** - `syncModelsWithUpdates()` 2. **Keine manuellen Schema-Updates** bei jedem Start 3. **updateSchema() nur bei komplexen Änderungen** verwenden 4. **Constraints regelmäßig prüfen** auf Duplikate 5. **Backup vor Schema-Updates** erstellen ## Aktuelle Konfiguration - **Standard-Synchronisation**: `syncModelsWithUpdates()` (intelligent) - **Schema-Updates**: Automatisch erkannt und angewendet - **Manuelle Updates**: Separate `updateSchema()` Funktion - **Automatische Updates**: Aktiviert und sicher - **Manuelle Kontrolle**: Verfügbar bei Bedarf ## Troubleshooting ### Problem: Duplizierte Constraints ```bash # Analyse ausführen node utils/cleanupDatabaseConstraints.js # Manuell bereinigen # Siehe SQL-Beispiele oben ``` ### Problem: Schema-Synchronisation schlägt fehl ```javascript // Intelligente Synchronisation sollte das automatisch handhaben // Bei Problemen: updateSchema() verwenden await updateSchema(models); ``` ### Problem: Performance-Probleme - **Intelligente Synchronisation** läuft nur bei Bedarf - **alter: true** wird nur verwendet wenn nötig - **Normale Starts** sind schnell und sicher ## Vorteile der neuen Lösung 1. **Automatisch**: Erkennt Schema-Updates automatisch 2. **Sicher**: Verwendet alter: true nur bei Bedarf 3. **Effizient**: Normale Starts ohne Schema-Updates 4. **Flexibel**: Kann für verschiedene Modelle erweitert werden 5. **Wartbar**: Klare Trennung zwischen Update-Logik und Synchronisation