PK, SKuserId, orderIdUSER#, ORDER#Type für explizite KennzeichnungGrundprinzip
One-to-Many: User mit Bestellungen
Abfragemuster
Vorteile
Abfragemuster & ihre Queries
// AP-01: User-Profil
GetItem: PK="USER#U-001", SK="PROFILE"
// AP-02: Alle Bestellungen eines Users
Query: PK = "USER#U-001"
SK begins_with "ORDER#"
// AP-03: Items einer Bestellung
Query: PK = "ORDER#2024-01-15"
SK begins_with "ITEM#"
// AP-04: User + alle Bestellungen
Query: PK = "USER#U-001"
// → liefert PROFILE + alle ORDER#-Items
Bestellungen Januar 2024
Query:
PK = "USER#U-001"
SK BETWEEN "ORDER#2024-01-01"
AND "ORDER#2024-01-31"
// Bestellungen ganzes Jahr 2024
Query:
PK = "USER#U-001"
SK begins_with "ORDER#2024"
// Neueste 5 Bestellungen (absteigend)
Query:
PK = "USER#U-001"
SK begins_with "ORDER#"
ScanIndexForward = false
Limit = 5
GSI-Grundlagen
GSI-Overloading
GSI1PK, GSI1SK// Item: User-Profil
{
PK: "USER#U-001",
SK: "PROFILE",
GSI1PK: "EMAIL#alice@x.de",
GSI1SK: "USER#U-001"
}
// Item: Bestellung
{
PK: "USER#U-001",
SK: "ORDER#2024-01-15",
GSI1PK: "STATUS#PENDING",
GSI1SK: "2024-01-15"
}
// Query AP-06: User nach E-Mail
Query GSI1:
GSI1PK = "EMAIL#alice@x.de"
Die Links verweisen auf die AWS-DynamoDB-Dokumentation
| Struktur | Link |
|---|---|
| Basistabelle | link |
| GSI1 | link |
| GSI2 | link |
Konzept
Anwendungsfälle
// Nur PENDING-Orders haben GSI1PK
{
PK: "USER#Alice",
SK: "ORDER#O-001",
GSI1PK: "STATUS#PENDING" // gesetzt
}
// Abgeschlossene Orders: kein GSI1PK
{
PK: "USER#Alice",
SK: "ORDER#O-002"
// kein GSI1PK → nicht im Sparse GSI
}
Die Follower-Beziehung ist many-to-many
Der Link verweist auf die AWS-DynamoDB-Dokumentation: link
| Aspekt | Single Table Design | Multi-Table Design |
|---|---|---|
| Queries | 1 Query für alle Daten (1 Roundtrip) | Mehrere Queries + App-seitige JOINs |
| Effizienz | Maximal bei richtigem Modell | Mehr Roundtrips, höhere Latenz |
| Komplexität | Modellierung komplex, Betrieb einfach | Modellierung einfach, Betrieb komplexer |
| Lesbarkeit | Niedrig (generische Keys) | Hoch (sprechende Tabellen/Spalten) |
| Schema-Änderungen | Aufwendig (Schlüsselstruktur ändern) | Einfacher (neue Tabelle hinzufügen) |
| Monitoring | Schwieriger (alles in einer Tabelle) | Einfacher (pro Tabelle) |
| Einsatz | Bekannte, stabile Zugriffsmuster | Explorative, sich ändernde Abfragen |