mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 22:39:40 +02:00
366 lines
8.9 KiB
Markdown
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._
|