Zum Zwecke der Diskussion betrachten wir ein FourSquare-Szenario.
Szenario
Einheiten:
- Benutzer
- Setzt
Beziehungen:
- Checkins: Benutzer <-> Orte, viele zu viele
- Freunde: Benutzer <-> Benutzer, viele zu viele
Datenbank Design
Diese weisen höchstwahrscheinlich Fehler auf.
RDBMS
Tabellen:
- Benutzer
- Setzt
- Checkins (Kreuzung)
- Freunde (Kreuzung)
Vorteile:
- GAP: Konsistenz, Verfügbarkeit
Nachteile:
- CAP: Partitionstoleranz, auch bekannt als Sharding
- Schemata = unflexible Struktur
- schlechte Replikation?
Graph
Objekte:
- Benutzer
- Setzt
Kanten:
- Freunde: Benutzer <-> Benutzer
- Checkins: Benutzer -> Orte
- enthält Zeitstempel
Vorteile:
- GAP: Konsistenz, Verfügbarkeit?
- schemenlose, leicht veränderbare Objekte und Kanten
- Diagramm-Traversal-Abfragen, zum Beispiel:
- Clustering
- Gruppen von Freunden finden
- Suche nach Restaurants, die von ähnlichen Leuten gemocht werden
- Haben Sie noch weitere häufig / nützliche Fragen?
- Clustering
Nachteile:
- CAP: Partitionstoleranz?
Dokument / Objekt
3 getrennte Datenbanken?
- Benutzer
- Freundesliste
- Checkins
- Zeitstempel
- Benutzer
- Ort
- Setzt
Vorteile:
- CAP: Verfügbarkeit, Partitionstoleranz
- schemenlose, leicht veränderbare Objekte
Nachteile:
- GAP: Konsistenz
Fragen
Für die Aufzeichnung endeten sie mit MongoDB. Zusätzlich zu all diesen Fragezeichen oben:
- Ich bin nicht sicher, wie ich eine Dokumentendatenbank implementieren soll.
- Wie erhalten Dokumentdatenbanken Partitionstoleranz?
- Um die Checkins eines einzelnen Benutzers zu erhalten, gehe ich davon aus, dass der Vorgang alle Checkins analysiert und die Metadaten nach dem Benutzernamen (Karte + Filter) filtert. Die Leistung beim Parsen von mehr als 1.000.000 Dokumenten für jeden Benutzer wäre furchtbar schlecht. Ich nehme an, das ist nicht das richtige Verhalten?
- Welche anderen Vor- und Nachteile gibt es?