managarten/apps/uload/docs/reports/database-optimization-report.md
Wuesteon ff80aeec1f refactor: restructure
monorepo with apps/ and services/
  directories
2025-11-26 03:03:24 +01:00

8.9 KiB

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):

  1. folders
  2. tags
  3. link_tags (Junction Table)
  4. clicks
  5. cards / user_cards
  6. themes
  7. card_templates
  8. template_ratings
  9. feature_requests
  10. feature_votes
  11. 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:

-- 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:

// 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:

// 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:

// 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:

// 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:

// 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:

// 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

// 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

// 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

# Vollständiges Backup vor Änderungen
./backend/pocketbase backup

Schritt 2: Test-Migrations

// 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.