-
Notifications
You must be signed in to change notification settings - Fork 1
Training Doc 05 best practices guide
github-actions[bot] edited this page Sep 1, 2026
·
3 revisions
BewΓ€hrte Muster und Empfehlungen fΓΌr den produktiven Einsatz von ThemisDB β Performance, Sicherheit, Betrieb und Datenmodellierung.
- Query-Optimierung
- Index-Best-Practices
- Transaktionen
- Sicherheit
- Deployment & Operations
- Fehlerbehandlung
- Datenmodellierung
- Monitoring
-- β
GUT: Parameterisiert, Query-Plan wird gecacht
FOR u IN users
FILTER u.age > @min_age AND u.city == @city
RETURN u
-- β SCHLECHT: Literale, kein Plan-Caching, Injection-Risiko
FOR u IN users
FILTER u.age > 18 AND u.city == "Berlin"
RETURN u
-- β
GUT: Sortierung und Limit auf wenige Dokumente beschrΓ€nkt
FOR u IN users
FILTER u.active == true
SORT u.score DESC
LIMIT 10 -- erst limitieren
LET orders = (FOR o IN orders FILTER o.user_id == u._key RETURN o)
RETURN { user: u, orders }
-- β SCHLECHT: Joins auf allen Dokumenten, dann erst limitieren
FOR u IN users
FOR o IN orders
FILTER o.user_id == u._key
SORT u.score DESC
LIMIT 10
RETURN { u, o }
-- β
GUT: Nur benΓΆtigte Felder zurΓΌckgeben
FOR u IN users
RETURN { id: u._key, name: u.name, email: u.email }
-- β SCHLECHT: Gesamtes Dokument ΓΌbertragen (bei groΓen Dokumenten kostspielig)
FOR u IN users
RETURN u
-- β
Subquery mit LIMIT begrenzen
LET recent = (
FOR o IN orders
FILTER o.user_id == user._key
SORT o.created DESC
LIMIT 5 -- Subquery begrenzen!
RETURN o
)
-- β Unbegrenzte Subquery ΓΌber groΓe Collections
LET all_orders = (
FOR o IN orders
FILTER o.user_id == user._key
RETURN o -- Kann riesig werden
)
| Abfrage-Typ | Index-Typ |
|---|---|
Exakte Gleichheit (==) |
Hash-Index |
Bereichsabfragen (>, <, BETWEEN) |
Skiplist-Index |
| Eindeutige Werte (E-Mail, SKU) | Hash UNIQUE |
| Sortierung + Bereich | Skiplist |
| Volltextsuche | Fulltext (BM25) |
| Geo-Abfragen | Geo-Index |
| VektorΓ€hnlichkeit | HNSW-Vektorindex |
| Multi-Feld-Queries | Composite Index |
-- Abfrage: FILTER status == "active" AND created >= "2025-01-01"
-- Index auf (status, created) ist optimal β Diskriminantestes Feld zuerst!
CREATE INDEX idx_users_status_created
ON users(status, created)
TYPE SKIPLIST
-- Dieser Index kann NICHT fΓΌr "FILTER created >= ..." ohne status genutzt werden
-- β Separaten Index fΓΌr created anlegen wenn benΓΆtigt
Problem: Zu viele Indizes verlangsamen Schreiboperationen.
Jeder Index muss bei INSERT/UPDATE/DELETE mitgepflegt werden.
Faustregel:
- Maximal 5β7 Indizes pro Collection
- Indizes regelmΓ€Γig auf Nutzung prΓΌfen
- Ungenutzte Indizes entfernen
BEGIN TRANSACTION
-- Validierung
LET balance = DOCUMENT("accounts", @from_account).balance
LET amount = @amount
// Strikter Vergleich β kein implizites Null-Handling
FILTER balance != null AND balance >= amount
-- Schreiboperationen
UPDATE @from_account WITH { balance: balance - amount } IN accounts
UPDATE @to_account WITH { balance: DOCUMENT("accounts", @to_account).balance + amount } IN accounts
-- Audit-Log
INSERT {
from: @from_account,
to: @to_account,
amount: amount,
timestamp: DATE_NOW()
} INTO transfer_log
COMMIT
# Locks immer in konsistenter Reihenfolge erwerben
# Ressourcen alphabetisch/numerisch ordnen verhindert Circular Waits
def transfer(from_id, to_id, amount):
# Immer die kleinere ID zuerst sperren
first, second = sorted([from_id, to_id])
with lock(first), lock(second):
execute_transfer(from_id, to_id, amount)import time
def execute_with_retry(client, query, bind_vars=None, max_retries=3):
for attempt in range(max_retries):
try:
return client.query(query, bind_vars=bind_vars)
except ThemisConflictError:
if attempt == max_retries - 1:
raise
time.sleep(0.05 * (2 ** attempt)) # Exponential backoff: 50ms, 100ms, 200ms{
"auth": {
"enabled": true,
"jwt_secret": "min_32_zeichen_starkes_geheimnis_hier",
"token_expiry": "8h",
"refresh": true
}
}-- Nur notwendige Berechtigungen vergeben
CREATE USER api_service PASSWORD @secure_password
-- Nur lesen auf benΓΆtigte Collections
GRANT READ ON COLLECTION products TO api_service
GRANT READ ON COLLECTION categories TO api_service
-- Schreiben nur auf notwendige Collections
GRANT READ, WRITE ON COLLECTION orders TO api_service
{
"server": {
"tls": {
"enabled": true,
"cert_path": "/etc/ssl/themisdb/cert.pem",
"key_path": "/etc/ssl/themisdb/key.pem",
"min_version": "TLS1.3",
"ciphers": ["TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256"]
}
}
}{
"storage": {
"encryption": {
"enabled": true,
"algorithm": "AES-256-GCM",
"key_source": "vault"
}
}
}# β
SICHER: Bind-Variablen
result = client.query(
"FOR u IN users FILTER u.email == @email RETURN u",
bind_vars={"email": user_input} # Automatisch escaped
)
# β UNSICHER: String-Konkatenation
query = f"FOR u IN users FILTER u.email == '{user_input}' RETURN u" # AQL-Injection mΓΆglich!# docker-compose.yml
services:
themisdb:
image: themisdb/themisdb:latest
deploy:
resources:
limits:
cpus: '4.0'
memory: 8G
reservations:
cpus: '2.0'
memory: 4G
environment:
THEMIS_MAX_MEMORY: 6144 # MB β unter docker limit
THEMIS_MAX_THREADS: 8# TΓ€gliches Backup via Cron
0 2 * * * curl -X POST http://localhost:8080/api/v1/backup \
-d "{\"path\": \"/backups/themisdb-$(date +%Y%m%d)\"}"
# Backup-IntegritΓ€t prΓΌfen
curl http://localhost:8080/api/v1/backup/verify \
-d '{"path": "/backups/themisdb-20250101"}'
# Alte Backups aufrΓ€umen (Γ€lter als 30 Tage)
find /backups -name "themisdb-*" -mtime +30 -delete# SIGTERM fΓΌr graceful shutdown senden (kein SIGKILL!)
docker stop --time=30 themisdb # 30 Sekunden Wartezeit
# In Kubernetes
spec:
terminationGracePeriodSeconds: 60Entwicklung: auth.enabled=false, log.level=debug
Staging: auth.enabled=true, TLS self-signed, log.level=info
Produktion: auth.enabled=true, TLS CA-signiert, log.level=warn, encryption=true
| Code | Bedeutung | Reaktion |
|---|---|---|
1200 |
Conflict / Optimistic Lock | Retry mit Backoff |
1202 |
Document not found | Anwendungslogik |
1203 |
Collection not found | Initialisierung prΓΌfen |
1210 |
Unique constraint violated | Duplikat behandeln |
1501 |
Transaction aborted | Retry |
403 |
Forbidden | Berechtigungen prΓΌfen |
503 |
Service unavailable | Circuit Breaker |
from themis_client import ThemisClient
import time
class ResilientThemisClient:
def __init__(self, base_url, failure_threshold=5, recovery_time=60):
self._client = ThemisClient(base_url)
self._failures = 0
self._threshold = failure_threshold
self._recovery_time = recovery_time
self._last_failure = 0
self._state = "CLOSED" # CLOSED, OPEN, HALF_OPEN
def query(self, aql, **kwargs):
if self._state == "OPEN":
if time.time() - self._last_failure > self._recovery_time:
self._state = "HALF_OPEN"
else:
raise RuntimeError("Circuit breaker OPEN β ThemisDB nicht erreichbar")
try:
result = self._client.query(aql, **kwargs)
self._failures = 0
self._state = "CLOSED"
return result
except Exception as e:
self._failures += 1
self._last_failure = time.time()
if self._failures >= self._threshold:
self._state = "OPEN"
raise_key-Format: {entity_type}_{uuid4_ohne_bindestrich}
Beispiele:
users: usr_550e8400e29b41d4a716446655440000
orders: ord_6ba7b810-9dad-11d1-80b4-00c04fd430c8
products: prd_6ba7b811-9dad-11d1-80b4-00c04fd430c8
Alternativ: NatΓΌrlicher SchlΓΌssel wenn eindeutig
products: SKU = "DB-GUIDE-2025-DE"
users: email (UNIQUE Hash-Index)
Immer ISO 8601 UTC: "2025-01-15T10:30:00Z"
Niemals: "15.01.2025", "Jan 15 2025", Unix-Timestamps (schwer lesbar)
AQL: DATE_NOW() gibt UTC-Timestamp in ms
ISO: DATE_ISO8601(DATE_NOW()) β "2025-01-15T10:30:00.000Z"
-- β
Soft Delete: Dokument behalten, markieren
UPDATE document WITH {
deleted_at: DATE_NOW(),
deleted_by: @user_id
} IN collection
-- In Abfragen immer filtern:
FILTER doc.deleted_at == null
-- β Hard Delete (Datenverlust, keine Audit-Trail)
REMOVE document IN collection
| Metrik | Warnschwelle | Kritische Schwelle |
|---|---|---|
| Query-Latenz P99 | > 100 ms | > 500 ms |
| Error-Rate | > 0.1% | > 1% |
| Memory-Nutzung | > 70% | > 90% |
| Disk-Nutzung | > 75% | > 90% |
| Connection-Pool | > 80% | > 95% |
| Replication-Lag | > 5 s | > 30 s |
# prometheus-rules.yml
groups:
- name: themisdb
rules:
- alert: ThemisDBHighLatency
expr: themisdb_query_duration_seconds{quantile="0.99"} > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "ThemisDB P99-Latenz > 500ms"
- alert: ThemisDBHighErrorRate
expr: rate(themisdb_queries_total{status="error"}[5m]) > 0.01
for: 2m
labels:
severity: critical{
"query": {
"slow_query_log": {
"enabled": true,
"threshold_ms": 100,
"log_path": "/var/log/themisdb/slow-queries.log"
}
}
}- Authentifizierung aktiviert (JWT oder mTLS)
- TLS 1.3 konfiguriert mit gΓΌltigem Zertifikat
- Minimale RBAC-Berechtigungen eingerichtet
- VerschlΓΌsselung at Rest aktiviert
- Netzwerk-Policies: nur notwendige Ports offen
- Audit-Logging aktiviert
- Alle FILTER-Felder haben Indizes
- Queries mit Bind-Variablen
- Slow-Query-Log aktiviert und ΓΌberwacht
- Query-Plan fΓΌr kritische Queries geprΓΌft (
EXPLAIN)
- Automatische Backups eingerichtet
- Backup-Restore getestet
- Monitoring mit Prometheus/Grafana
- Alerting auf kritische Metriken
- Graceful Shutdown konfiguriert
- Ressourcenlimits gesetzt
- Schema-Dokumentation aktuell
- Migrations-Skripte versioniert
- Rollback-Strategie definiert
ThemisDB 1.9.0-beta Β· Home Β· Module-Index Β· GitHub Β· Issues
ThemisDB 1.9.0-beta Β· Home Β· Wiki-Index Β· Module-Index Β· FAQ Β· Quick-Reference Β· GitHub Β· Issues Β· Discussions Β· License
- Batch Operations
- Best Practices
- CRUD Tutorial
- Custom Document Ingestion
- Getting Started Tutorial
- Interactive Examples
- Schema Design
- Video Tutorials
- AQL Reference
- AQL Examples
- AQL Overview
- AQL Feature Roadmap
- AQL Geospatial Guide
- AQL LLM Migration Guide
- AQL API
- AQL Grammar (EBNF)
- AQL Root Overview
- AQL Examples (root)
- API Reference
- API Module README
- OpenAPI Overview
- Client SDK Overview
- SDK Overview
- Operations
- Operations Overview
- Operations Runbook
- Operations Handbook
- ThemisCtl Admin Guide
- Pipeline E2E SOPs
- Deploy Overview
- Docker Overview
- Docker Hub README
- Helm Overview
- Packaging Overview
- Operator Overview
- Security Policy
- Production Hardening Checklist
- Security Hardening Guide
- Encryption Key Management
- Access Control Framework
- Zero Trust Policy
- API Authentication & Authorization
- HSM Production Setup
- PKCS11 Integration
- DSGVO / SOC2 Checklist
- Access Model Runbooks
- Access Model Dashboard
- Maturity Automation Runbook
- Access Review Automation
- Access Model Dashboard
- Access Model Runbooks
- Rights Revocation
- Dr Checklists
- Dr Testing
- Incident Response Playbook
- Incident Response Testing
- GPU Oom Recovery
- Grammar Debugging
- Metrics Scrape Troubleshooting
- Model Swap Procedure
- Quota Tuning
- Subagent Deployment
- Logging Configuration
- Content Model
- Crypto & Keys
- Feature Flags Reference
- Modular Architecture Roadmap
- Modularization Guide
- Module Architecture Index
- PostgreSQL Wire Protocol
- Query Scheduling
- Raft Consensus Design
- Resource Pooling
- Source Directory Guide
- Unified Access Model
- E1 001 Layered Retrieval Design
- E1 002 Ann Abstraction Strategy
- E1 003 Tensor Summary Types
- E1 004 Lora Package Distinction
- E1 005 Model Switch Compatibility
- E1 006 Federated Tensor Summaries
- E2 001 Evaluation Framework Design
- E2 002 Hardware Profile Strategy
- E2 003 Query Planner Routing Model
- E2 004 Approximation Governance Rules
- E2 005 Cross Layer Fallback Confidence Policy
- E3 001 Distributed Tensor Design
- E3 002 Manifest Coordination Strategy
- E3 003 Recovery And Erasure Choice
- E3 004 Tensor Fabric Infrastructure
- Contributing
- Contributing (root)
- Code of Conduct
- Support
- Maintainers
- CTest Guide
- Build Quick Reference
- Developer Wiki Index
- Build / Test / CI
- Module Index
- Branching Strategy
- Disabled Stub Policy
- Docs PR Policy
- GA Promotion Sign Off
- Github Milestones Setup
- Maturity Claim Verification Checklist
- Maturity Evidence Registry
- Merge Gate Bot Config
- Merge Gate Status Live
- Phase 1 Closure Report
- Phase Closure Policy
- Phase Dependency Graph
- Phase3 Enforcement Runbook
- Plugin Submodule Rollback
- PR Version Targeting
- PR Version Targeting Backfill
- Production Ready 2026 Delivery Plan
- Query Module Status
- Readme
- Release Promotion Gate Policy
- Release Validation Checklist
- Security Module 5671 Evidence Summary
- Sharding P6 Residual Risk Acceptance
- Sourcecode Compliance Governance
- Updates Development Status Sign Off
- Wave C Implementation Complete
- Blob Storage
- Cuda
- Ethics Ai
- Exporters
- Huggingface
- Image Analysis
- Importers
- RPC
- Scraper
- Themisdb Ai Watermark Detector
- User Storage Encrypted
- Chimera Architecture
- Chimera Future
- Chimera Readme
- Chimera Roadmap
- Covina Fastapi Ingestion Architecture
- Covina Fastapi Ingestion Future
- Covina Fastapi Ingestion Roadmap
- Vcc Base Architecture
- Vcc Base Future
- Vcc Base Roadmap
- Vcc Clara Ingestion Architecture
- Vcc Clara Ingestion Future
- Vcc Clara Ingestion Roadmap
- Vcc Veritas Architecture
- Vcc Veritas Future
- Vcc Veritas Roadmap
- 01 Hello World
- 02 Todo App
- 03 Contact Manager
- 04 Inventory System
- 05 Time Series Monitor
- 06 Graph Social Network
- 07 Vector Search Documents
- 08 Dms Erp System
- 09 Iot Sensor Network
- 10 Drone Image Analysis
- 11 Blog Wiki
- 12 Expense Tracker
- 13 Recipe Manager
- 14 Ecommerce Catalog
- 15 Event Management
- 16 Kanban Board
- 17 Crm
- 18 Realtime Chat
- 19 Recommendation Engine
- 20 Smart Home
- 21 Coding Platform
- 22 AQL Diagram Tool
- 23 Traveling Salesman
- 24 Moral Philosophy Debates
- API Versioning
- Distributed Sharding
- Feedback Plugins
- Geo
- Gnn
- Image Analysis
- Legal Lora Training
- LLM
- Lora Sync
- Migration
- Nlp
- Performance
- Railway
- Replication
- Rope Visualization
- Sample Product Config
- Security
- Client SDK Overview
- Quickstart
- Sdk Enhancements
- Sdk Implementation Summary
- Test Suite Readme
- Go
- Java
- Javascript
- Php
- Python
- Ruby
- Rust
- Typescript
- 01 Grundlegende Operationen
- 02 AQL Queries
- 03 Graph Daten
- 04 Multimodell Anwendung
- 01 Quickstart Guide
- 02 AQL Referenz Kurzuebersicht
- 03 Datenmodellierung Guide
- 04 Uebungsaufgaben
- 05 Best Practices Guide
- Training Documents
- Training Overview
- 01 Einfuehrung Und Uebersicht
- 02 Datenmodelle Und Architektur
- 03 AQL Abfragesprache
- 04 Installation Und Setup
- 05 Anwendungsbeispiele
- Training Presentations
- Dependencies Readme
- Processmonitor Readme
- Themis.admintools.shared Readme
- Themis.aqlquerybuilder Readme
- Themis.aqlquerybuilder Roadmap
- Themis.auditlogviewer Readme
- Themis.auditlogviewer Roadmap
- Themis.classificationdashboard Readme
- Themis.classificationdashboard Roadmap
- Themis.compliancereports Readme
- Themis.compliancereports Roadmap
- Themis.gisviewer.controlpanel Readme
- Themis.gisviewer.controlpanel Roadmap
- Themis.impactanalysisviewer Readme
- Themis.impactanalysisviewer Roadmap
- Themis.ingestiontool Readme
- Themis.ingestiontool Roadmap
- Themis.keyrotationdashboard Readme
- Themis.keyrotationdashboard Roadmap
- Themis.piimanager Readme
- Themis.piimanager Roadmap
- Themis.retentionmanager Readme
- Themis.retentionmanager Roadmap
- Themis.sagaverifier Readme
- Themis.sagaverifier Roadmap
- Themis.usbadmintool Readme
- Themis.usbadmintool Roadmap
- CI Readme
- CI Roadmap
- Compiler Diagnostics Readme
- Compiler Diagnostics Roadmap
- Completion Readme
- Copilot Ollama Router Readme
- Copilot Ollama Router Roadmap
- Gnn Readme
- Gnn Roadmap
- Rope Visualizer Readme
- Rope Visualizer Roadmap
- Tco Calculator Readme
- Tco Calculator Roadmap
- Tests Readme
- Tests Roadmap
- Themis Config Wx Readme
- Themis Docs Builder Readme
- Wikipedia Ingestion Readme