Ich habe User-Modell-Objekt mit ziemlich vielen Feldern (Eigenschaften, wenn Sie möchten) in es. Sagen wir "Vorname", "Nachname", "Stadt" und "Geburtsjahr". Jeder Benutzer erhält auch eine "eindeutige ID".
Ich möchte in der Lage sein, nach ihnen zu suchen. Wie kann ich das richtig machen? Wie kann man das überhaupt machen?
Mein Verständnis (funktioniert für so ziemlich jeden Schlüssel-Wert-Speicher - erst kommt der Schlüssel, dann der Wert)
u:123456789 = serialisiertes_json_Objekt
("u" als einfaches Präfix für die Benutzerschlüssel, 123456789 ist die "eindeutige ID").
Wenn ich nun denke, dass ich nach Vor- und Nachnamen suchen möchte, kann ich das speichern:
f:Steve = u:384734807,u:2398248764,u:23276263 f:Alex = u:12324355,u:121324334
Der Schlüssel ist also "f" - das ist das Präfix für Vornamen, und "Steve" ist der eigentliche Vorname. Für "u:Steve" speichern wir als Wert alle Benutzerkennungen, die "Steve's" sind.
Das macht jede Suche sehr, sehr einfach. Die Abfrage nach wenigen Feldern (Eigenschaften) - sagen wir nach Vorname (z.B. "Steve") und Nachname (z.B. "l:Anything") ist immer noch einfach - zuerst die Liste der Benutzerkennungen aus "f:Steve", dann die Liste aus "l:Anything", die sich kreuzenden Benutzerkennungen finden, und los geht's.
Probleme (und davon gibt es eine ganze Reihe):
-
Das Speichern, Aktualisieren und Löschen von Benutzern ist mühsam. Es muss ein atomarer und konsistenter Vorgang sein. Außerdem, wenn wir die Größe des Wertes auf einen bestimmten Wert begrenzt haben - dann sind wir in (potenziellen) Schwierigkeiten. Und wirklich nicht von einer Antwort hier. Nur die Liste der Benutzerkennungen zippen? Nicht allzu cool, obwohl.
-
Nach welcher ID wollen wir das neue Feld für die Suche hinzufügen. Eventuell. Sagen wir nach "Stadt". Wir können das natürlich auch so machen: "c:Los Angeles" = ..., "c:Chicago" = ..., aber wenn wir all diese "Suchoptionen" nicht von Anfang an vorgesehen haben, dann müssen wir in der Lage sein, einen Nachtjob oder so etwas zu erstellen, um alle vorhandenen Benutzerdatensätze zu durchsuchen und diese "c:CITY" für sie zu aktualisieren... Eine ganz schön große Aufgabe!
-
Probleme mit der Verriegelung. Benutzer "u:123" aktualisiert seinen Namen "Alex", und Benutzer "u:456" aktualisiert seinen Namen "Alex". Beide müssen "f:Alex" mit ihren IDs aktualisieren. Das bedeutet, dass wir entweder ein Überschreibungsproblem bekommen, oder dass eine Aktualisierung auf eine andere wartet (und was passiert, wenn es viele davon gibt?!).
Wie kann man das am besten machen? Muss ich dabei berücksichtigen, dass ich nach vielen Feldern suchen möchte?
P.S. Bitte, die Frage bezieht sich auf HBase/Cassandra/NoSQL/Key-Value-Storages. Bitte bitte - keine Ratschläge, MySQL zu verwenden und SELECTs zu "lesen"; und sich "später" um Skalierungsprobleme zu kümmern. Es gibt einen Grund, warum ich MEINE Frage genau so gestellt habe, wie ich es getan habe :-)