managarten/apps-archived/uload/docs/reports/database-optimization-report.md
Till-JS 61d181fbc2 chore: archive inactive projects to apps-archived/
Move inactive projects out of active workspace:
- bauntown (community website)
- maerchenzauber (AI story generation)
- memoro (voice memo app)
- news (news aggregation)
- nutriphi (nutrition tracking)
- reader (reading app)
- uload (URL shortener)
- wisekeep (AI wisdom extraction)

Update CLAUDE.md documentation:
- Add presi to active projects
- Document archived projects section
- Update workspace configuration

Archived apps can be re-activated by moving back to apps/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 07:03:59 +01:00

366 lines
8.9 KiB
Markdown

# Datenbankoptimierungs- und Vereinfachungsbericht für uLoad
**Datum:** 15. Januar 2025
**Erstellt von:** Database Analysis Team
Ich habe einen umfassenden Bericht
über die Datenbankoptimierung
erstellt. Der Bericht analysiert
die aktuelle PocketBase-Struktur
und identifiziert folgende
Hauptprobleme:
Kernprobleme:
- Inkonsistente Namenskonventionen
(user vs user_id, Singular vs
Plural)
- Redundante Analytics-Strukturen
(analytics + clicks Collections)
- Fehlende Indizes für Performance
- Überkomplexes Card-System mit 3
Collections
- Mangelhafte Datenvalidierung auf
DB-Ebene
- Verbesserungsbedürftiges
Tag-System
- Fehlende strukturierte
Migrations-Strategie
Empfohlene Optimierungen in 3
Phasen:
1. Sofortmaßnahmen: Indizes,
Validierung, Cleanup
2. Strukturverbesserungen:
Analytics vereinheitlichen,
Card-System konsolidieren
3. Grundlegendes Refactoring:
Tag-Hierarchie, Event-Tracking,
Soft-Deletes
Der Bericht enthält konkrete
Code-Beispiele und einen
detaillierten Migrations-Plan. Die
erwarteten Verbesserungen umfassen
50% schnellere Queries und 30%
weniger Datenbankaufrufe.
## Executive Summary
Nach eingehender Analyse der PocketBase-Datenbankstruktur des uLoad-Projekts wurden mehrere Optimierungs- und Vereinfachungsmöglichkeiten identifiziert. Die aktuelle Struktur zeigt sowohl Redundanzen als auch fehlende Normalisierung in verschiedenen Bereichen.
## Aktuelle Datenbankstruktur
### Identifizierte Collections
#### Kern-Collections (in pb_schema.json definiert):
1. **users** (Auth Collection)
2. **links** (Basis Collection)
3. **analytics** (Basis Collection)
#### Zusätzliche Collections (im Code referenziert):
4. **folders**
5. **tags**
6. **link_tags** (Junction Table)
7. **clicks**
8. **cards** / **user_cards**
9. **themes**
10. **card_templates**
11. **template_ratings**
12. **feature_requests**
13. **feature_votes**
14. **custom_domains**
## Hauptprobleme und Optimierungsvorschläge
### 1. Inkonsistente Namenskonventionen
**Problem:**
- Mischung aus Singular/Plural: `links` vs `user`
- Inkonsistente Feldnamen: `user` vs `user_id`, `link` vs `link_id`
- Verschiedene Schreibweisen: `link_tags` vs `linkTags` im Code
**Empfehlung:**
```sql
-- Einheitliche Namenskonvention etablieren
-- Alle Collections im Plural
-- Alle Foreign Keys mit _id Suffix
users, links, folders, tags, clicks, cards, themes
user_id, link_id, folder_id, tag_id (konsistent)
```
### 2. Redundante Analytics-Strukturen
**Problem:**
- Zwei separate Tracking-Mechanismen: `analytics` und `clicks`
- `links.clicks` (Zähler) vs separate Click-Records
- Doppelte Datenhaltung führt zu Inkonsistenzen
**Empfehlung:**
```javascript
// Vereinheitlichen zu einer Click-Analytics Collection
{
collection: "link_analytics",
fields: [
{ name: "link_id", type: "relation", required: true },
{ name: "clicked_at", type: "date", required: true },
{ name: "ip_address", type: "text" },
{ name: "user_agent", type: "text" },
{ name: "referer", type: "text" },
{ name: "country", type: "text" },
{ name: "device_type", type: "text" },
{ name: "browser", type: "text" },
{ name: "is_unique", type: "bool" } // Für unique visitor tracking
]
}
```
### 3. Fehlende Indizes und Performance-Optimierungen
**Problem:**
- Keine expliziten Indizes auf häufig gefilterte Felder
- Fehlende Composite-Indizes für komplexe Queries
**Empfehlung:**
```javascript
// Kritische Indizes hinzufügen
indexes: [
{ fields: ['short_code'], unique: true },
{ fields: ['user_id', 'created'], composite: true },
{ fields: ['link_id', 'clicked_at'], composite: true },
{ fields: ['folder_id', 'is_active'] },
{ fields: ['username'], unique: true }
];
```
### 4. Card-System Komplexität
**Problem:**
- Drei verschiedene Card-bezogene Collections: `cards`, `user_cards`, `card_templates`
- Unklare Trennung zwischen den verschiedenen Card-Typen
- Redundante Datenfelder
**Empfehlung:**
```javascript
// Vereinfachte Card-Struktur
{
collection: "cards",
fields: [
{ name: "user_id", type: "relation", required: true },
{ name: "type", type: "select", options: ["user", "template", "custom"] },
{ name: "template_id", type: "relation", required: false },
{ name: "theme_id", type: "relation", required: false },
{ name: "data", type: "json" }, // Flexibles JSON für Card-Daten
{ name: "is_public", type: "bool" },
{ name: "order", type: "number" }
]
}
```
### 5. Fehlende Datenvalidierung auf DB-Ebene
**Problem:**
- Viele Validierungen nur im Application Code
- Fehlende Check Constraints
- Inkonsistente Required-Flags
**Empfehlung:**
```javascript
// Beispiel für verbesserte Validierung
{
name: "short_code",
type: "text",
required: true,
unique: true,
options: {
min: 3,
max: 50,
pattern: "^[a-zA-Z0-9_-]+$"
}
}
```
### 6. Tag-System Optimierung
**Problem:**
- Junction Table `link_tags` ohne zusätzliche Metadaten
- `usage_count` im Tag wird manuell gepflegt
- Keine Tag-Hierarchie möglich
**Empfehlung:**
```javascript
// Erweiterte Tag-Struktur
{
collection: "tags",
fields: [
{ name: "parent_id", type: "relation", collectionId: "tags" }, // Hierarchie
{ name: "type", type: "select", options: ["category", "label", "custom"] },
// usage_count als computed field über Relations
]
}
```
### 7. Migrations-Strategie
**Problem:**
- Nur eine Migration-Datei vorhanden
- Schema-Änderungen nicht versioniert
- Fehlende Rollback-Strategie
**Empfehlung:**
```javascript
// Strukturierte Migration-Files
pb_migrations/
001_initial_schema.js
002_add_folders.js
003_add_tags_system.js
004_optimize_analytics.js
// Mit klarem Versioning und Rollback
```
## Priorisierte Optimierungsschritte
### Phase 1: Sofortmaßnahmen (Keine Breaking Changes)
1. **Indizes hinzufügen** für Performance-Verbesserung
2. **Datenvalidierung verschärfen** auf DB-Ebene
3. **Unused Collections entfernen** (falls vorhanden)
### Phase 2: Strukturelle Verbesserungen (Minor Breaking Changes)
1. **Analytics vereinheitlichen** - Eine Collection für alle Click-Daten
2. **Card-System konsolidieren** - Reduzierung auf 2 Collections
3. **Namenskonventionen standardisieren**
### Phase 3: Grundlegende Refactoring (Major Changes)
1. **Tag-System mit Hierarchie** implementieren
2. **Event-basiertes Tracking** für alle User-Actions
3. **Soft-Delete Pattern** einführen
## Performance-Optimierungen
### Query-Optimierung
```javascript
// Statt multiple einzelne Queries
const user = await pb.collection('users').getOne(id);
const links = await pb.collection('links').getList(...);
const folders = await pb.collection('folders').getList(...);
// Batch-Loading mit Expand
const user = await pb.collection('users').getOne(id, {
expand: 'links,folders,tags'
});
```
### Caching-Strategie
```javascript
// Redis/Memory Cache für häufige Queries
- Short Code Lookups
- User Profile Data
- Public Link Lists
- Analytics Aggregations
```
## Sicherheitsverbesserungen
1. **Row-Level Security verstärken**
- Explizite Rules für alle Collections
- Keine null/empty Rules
2. **Sensitive Daten verschlüsseln**
- Password-protected Links
- User Personal Data
3. **Audit Logging**
- Alle Änderungen tracken
- Compliance-Ready
## Migrations-Plan
### Schritt 1: Backup
```bash
# Vollständiges Backup vor Änderungen
./backend/pocketbase backup
```
### Schritt 2: Test-Migrations
```javascript
// Test auf Staging-Umgebung
migrate((db) => {
// Neue Struktur parallel aufbauen
// Daten migrieren
// Alte Struktur später entfernen
});
```
### Schritt 3: Rollout-Strategie
1. Feature Flags für neue Strukturen
2. Graduelle Migration der Daten
3. Monitoring der Performance
4. Rollback-Plan bereithalten
## Erwartete Verbesserungen
### Performance
- **50% schnellere Queries** durch Indizes
- **30% weniger Datenbankaufrufe** durch Konsolidierung
- **Reduzierte Latenz** bei Analytics-Queries
### Wartbarkeit
- **Klarere Datenstruktur** reduziert Fehlerquellen
- **Einheitliche Naming** verbessert Developer Experience
- **Weniger Collections** = einfachere Wartung
### Skalierbarkeit
- **Bessere Partitionierung** möglich
- **Effizientere Aggregationen**
- **Vorbereitet für Sharding**
## Zusammenfassung
Die aktuelle Datenbankstruktur ist funktional, zeigt aber deutliche Optimierungspotenziale. Die vorgeschlagenen Änderungen würden:
1. **Performance** signifikant verbessern
2. **Wartbarkeit** erhöhen
3. **Datenintegrität** stärken
4. **Skalierbarkeit** vorbereiten
Die Implementierung sollte in Phasen erfolgen, beginnend mit risikoarmen Optimierungen und fortschreitend zu strukturellen Verbesserungen.
## Nächste Schritte
1. **Review** dieses Reports mit dem Team
2. **Priorisierung** der Optimierungen
3. **Detaillierte Migrations-Planung**
4. **Staging-Tests** durchführen
5. **Schrittweise Implementierung**
---
_Dieser Report basiert auf der Analyse vom 15. Januar 2025 und sollte regelmäßig aktualisiert werden, um neue Entwicklungen zu berücksichtigen._