Zugehörige Dokumente in IBM Cloudant gruppieren
Herkömmlicherweise werden E-Commerce-Systeme mit relationalen Datenbanken erstellt. Diese Datenbanken verwenden üblicherweise eine Reihe von verknüpften Tabellen zur Aufzeichnung von Umsätzen, Kundendetails, gekauften Produkten und Informationen zur Zustellungsverfolgung.
Relationale Datenbanken bieten eine hohe Konsistenz. Dies bedeutet, dass Anwendungsentwickler bei ihren Anwendungen auf die Stärken einer Datenbank aufbauen können. Dies umfasst die Verwendung von Verbindungen zwischen Sammlungen, von Aufzählungen zum Aufzeichnen des Status eines Objekts und von Datenbanktransaktionen, um autarke Operationen zu gewährleisten.
IBM® Cloudant® for IBM Cloud® gibt der Verfügbarkeit Priorität gegenüber der Konsistenz. Es handelt sich um eine hochverfügbare, fehlertolerante, verteilte Datenbank mit sukzessiver Konsistenz. Die verteilte Datenbank sorgt dafür, dass der Einkaufsservice für Kunden immer verfügbar und skalierbar genug ist, um zahlreiche Benutzer zu bedienen, die gleichzeitig Einkäufe tätigen. Ihre Anwendung kann somit von den Stärken von IBM Cloudant profitieren und andere Möglichkeiten als bei einer relationalen Datenbank nutzen.
In diesem Abschnitt werden einige Faktoren erläutert, die beim Erstellen eines E-Commerce-Systems eine Rolle spielen, das die Stärken von IBM Cloudant für sich nutzt. IBM Cloudant verwendet Konzepte, die auch in vielen anderen Bereichen anwendbar sind:
- Verwendung mehrerer Dokumente zum Darstellen des Status eines Einkaufs, statt regelmäßige Aktualisierung eines einzelnen Dokuments.
- Speichern von Kopien von zugehörigen Objekten in einer bestimmten Reihenfolge, statt sie zu einer anderen Sammlung hinzuzufügen.
- Erstellen von Ansichten zum Sortieren von Dokumenten nach
order_id
, um den aktuellen Status eines Einkaufs wiederzugeben.
Sie können beispielsweise ein Dokument purchase
erstellen, das Details wie die bestellten Artikel, Kundeninformationen, Kosten und Zustellinformationen enthält.
Im folgenden Beispieldokument wird ein Kauf beschrieben:
{
"_id": "023f7a21dbe8a4177a2816e4ad1ea27e",
"type": "purchase",
"order_id": "320afa89017426b994162ab004ce3383",
"basket": [
{
"product_id": "A56",
"title": "Adele - 25",
"category": "Audio CD",
"price": 8.33,
"tax": 0.2,
"quantity": 2
},
{
"product_id": "B32",
"title": "The Lady In The Van - Alan Bennett",
"category": "Paperback book",
"price": 3.49,
"tax": 0,
"quantity": 2
}
],
"account_id": "985522332",
"delivery": {
"option": "Next Day",
"price": 2.99,
"address": {
"street": "17 Front Street",
"town": "Middlemarch",
"postcode": "W1A 1AA"
}
},
"pretax" : 20.15,
"tax" : 3.32,
"total": 26.46
}
Dieses Dokument liefert genug Daten zu einem Einkaufsdatensatz, um eine Zusammenfassung einer Bestellung auf einer Webseite oder in einer E-Mail anzugeben, ohne weitere Datensätze abrufen zu müssen. Beachten Sie die Schlüsseldetails zu der Bestellung. Dies gilt insbesondere für die folgenden Details:
- Der Einkaufskorb enthält Referenz-IDs (
product_id
) für eine Produktdatenbank, die an einer anderen Stelle gespeichert ist. - Der Einkaufskorb dupliziert manche der Produktdaten in diesem Datensatz, um den Status der eingekauften Artikel an der Datenkasse aufzuzeichnen.
- Das Dokument enthält keine Felder, die den Status der Bestellung markieren. Weitere Dokumente werden später hinzugefügt, um Zahlungen und Lieferungen aufzuzeichnen.
- Die Datenbank generiert automatisch beim Einfügen des Dokuments in die Datenbank eine Dokumenten-ID (
_id
). - Eine eindeutige ID (
order_id
) wird mit jedem Einkaufsdatensatz bereitgestellt, auf den später Bezug genommen werden kann.
Wenn der Kunde eine Bestellung platziert (in der Regel beim Übergang in die Check-Out-Phase), wird ein Bestellungsdatensatz ähnlich dem vorherigen Beispiel erstellt.
Eindeutige IDs generieren
In einer relationalen Datenbank werden sequenzielle, automatische Erhöhungen von Zahlen (Auto-Inkrementierung) häufig verwendet. In verteilten Datenbanken werden Daten dagegen über einen Cluster von Servern verteilt und längere eindeutige IDs werden verwendet, um sicherzustellen, dass Dokumente mit einer eindeutigen ID gespeichert werden.
Wenn Sie eine eindeutige Kennung zur Verwendung in Ihrer Anwendung erstellen möchten, z. B. order_id
, rufen Sie die GET _uuids
-Endpunkt in der
IBM Cloudant -API auf. Die Datenbank generiert eine ID für Sie. Derselbe Endpunkt kann zum Generieren mehrerer IDs verwendet werden, indem ein Parameter count
hinzugefügt wird, z. B. /_uuids?count=10
.
Aufzeichnen von Zahlungen
Wenn der Kunde erfolgreich seine Artikel kauft, werden weitere Datensätze zur Datenbank hinzugefügt, um die Bestellung aufzuzeichnen.
Beispiel für einen Zahlungsdatensatz
{
"_id": "bf70c30ea5d8c3cd088fef98ad678e9e",
"type": "payment",
"account_id": "985522332",
"order_id": "320afa89017426b994162ab004ce3383",
"value": 6.46,
"method": "credit card",
"payment_reference": "AB9977G244FF2F667"
}
...
{
"_id": "12c0ea6cd3d2c6e3b1d34442aea6a2d9",
"type": "payment",
"account_id": "985522332",
"order_id": "320afa89017426b994162ab004ce3383",
"value": 20.00,
"method": "voucher",
"payment_reference": "Q88775662377224"
}
Im vorherigen Beispiel hat der Kunde mit einer Kreditkarte bezahlt und einen Gutschein eingelöst. Die Summe der beiden Zahlungen ergibt den Betrag der Bestellung. Jede Zahlung wurde als separates Dokument in IBM Cloudant geschrieben.
Sie könnten den Status einer Bestellung einsehen, indem Sie eine Ansicht mit allem, das Sie über eine order_id
wissen, erstellen. Die Ansicht würde ein Hauptbuch mit den folgenden Informationen aktivieren:
- Gesamteinkaufssummen als positive Zahlen.
- Zahlungen gegen das Konto als negative Zahlen.
Eine 'map'-Funktion könnte verwendet werden, um die erforderlichen Werte zu ermitteln.
Beispiel einer 'map'-Funktion zum Suchen nach Gesamteinkaufs- und Zahlungswerten
function (doc) {
if (doc.type === 'purchase') {
emit(doc.order_id, doc.total);
} else {
if (doc.type === 'payment') {
emit(doc.order_id, -doc.value);
}
}
}
Verwenden Sie den integrierten Reduzierer _sum
reducer, um das Ergebnis als Hauptbuch von Zahlungsereignessen zu generieren.
Beispiel für die Verwendung der integrierten 'reduce'-Funktion _sum
, abgefragt mit ?reduce=false
{
"total_rows":3,"offset":0,"rows":[
{
"id":"320afa89017426b994162ab004ce3383",
"key":"985522332",
"value":26.46
},
{
"id":"320afa89017426b994162ab004ce3383",
"key":"985522332",
"value":-20
},
{
"id":"320afa89017426b994162ab004ce3383",
"key":"985522332",
"value":-6.46
}
]
}
Alternativ könnten Sie Gesamtwerte nach order_id
erzeugen.
Beispiel von nach order_id
gruppierten Gesamtsummen, mit ?group_level=1
{
"rows":[
{
"key":"320afa89017426b994162ab004ce3383",
"value":0
}
]
}
Da die Ansicht im vorherigen Beispiel den Wert 0 für den Bestellwert zurückgibt, gibt das Ergebnis an, dass die Bestellung vollständig bezahlt ist. Die negativen Zahlungsbeträge werden durch den positiven Gesamtbetrag für den Auftrag ausgeglichen. Das Aufzeichnen von Ereignissen in Form von separaten Dokumenten (z. B. ein Dokument für die Bestellung und ein Dokument für jede Zahlung) hat sich in IBM Cloudant bewährt. Auf diese Weise lassen sich Konflikte vermeiden, die entstehen können, wenn ein Dokument gleichzeitig durch mehrere Prozesse geändert wird.
Weitere Dokumente hinzufügen
Sie können weitere separate Dokumente zur Datenbank hinzufügen, um die folgenden Statusänderungen aufzuzeichnen, während die Bestellung bereitgestellt und versendet wird:
- Senden von Benachrichtigungen
- Liefereingänge
- Rückerstattungsdatensätze
Wenn die Daten eingehen, schreibt IBM Cloudant separat in jedes Dokument. Es ist deshalb nicht erforderlich, das zentrale Einkaufsdokument zu ändern.
Vorteile des Speicherns von Bestellungen mit IBM Cloudant
Das Speichern von Bestellinformationen mit IBM Cloudant macht ein Bestellsystem hoch verfügbar und skalierbar. Mit einem derartigen Bestellsystem können Sie große Mengen von Daten und viele parallele Zugriffe verarbeiten. Durch das Modellieren der Daten in separaten Dokumenten, die nur einmal geschrieben werden, können Sie sicherstellen, dass zwischen Dokumenten nie Konflikte auftreten (z. B. beim gleichzeitigen Zugriff auf dasselbe Dokument durch separate Prozesse).
Außerdem können Dokumente Kopien von Daten enthalten, die in anderen Sammlungen vorhanden sind, um verbundene Daten mit einem Fremdschlüssel darzustellen. Beispiel: zeichnet IBM Cloudant den Status eines Einkaufskorbs zum Zeitpunkt des Einkaufs
auf. Diese Aufzeichnung ermöglicht es, den Status einer Bestellung durch einen einzelnen Aufruf der IBM Cloudant-Ansicht abzurufen, die zu einer Auftrags-ID (order_id
) gehörige Dokumente zusammenfasst.