Ansätze zu generieren, die auto-increment numeric-ids in CouchDB
Da CouchDB bietet keine Unterstützung für SQL gleichermaßen AUTO_INCREMENT, was wäre dein Lösungsansatz zu generieren sequenzieller eindeutige numerische ids für Ihre Dokumente?
Ich bin über numerische ids für:
- Benutzerfreundliche IDs (z.B. TASK-123, - ABF-001, etc.)
- Integration mit Bibliotheken/Systeme, bei denen die numerischen Primärschlüssel
Ich bin mir bewusst, der Probleme mit der Replikation, etc. Das ist, warum ich bin daran interessiert, wie Menschen versuchen, Sie zu überwinden dieses Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Dominic Barnes sagt, auto-increment-Integer sind nicht skalierbar, nicht verteilt-freundlich oder cloud-freundlich. Es scheint, dass jede app muss heute eine mobile version mit offline-Unterstützung, und das ist nicht direkt kompatibel mit auto-increment-Integer-zahlen. Wir alle wissen das, aber es ist wahr: auto-increment-Integer sind notwendig für legacy-code, und wohl auch andere Sachen.
In beiden Szenarien, sind Sie verantwortlich für die Herstellung der auto-increment-integer. Eine Ansicht ausgeführt wird
emit(the_numeric_id, null)
. (Sie könnten auch ein "Typ" - namespace, z.B. durchemit([doc.type, the_numeric_id], null)
. Abfrage für die Letzte Zeile (z.B. mit einemstartkey=MAXINT&descending=true&limit=1
erhöhen Sie den Wert, der zurückgegeben wird, und das ist deine nächste id. Der Versuch zu sparen, ist in einer Schleife, die kann wiederholen, wenn gab es eine Kollision.Können Sie auch spielen tricks wenn Sie nicht brauchen, 100% Dichte der Liste der IDs. Zum Beispiel, können Sie hinzufügen der Zeitstempel zu den
emit()
Zeilen, und die Schätzung der Erstellung von Dokumenten Geschwindigkeit und Schrittweite durch die Geschwindigkeit mal Ihre Berechnung und Zeit übertragen. Man könnte auch einfach erhöht durch eine zufällige ganze Zahl zwischen 1 und N, so dass die meisten der Zeit die erste insert funktioniert, auf Kosten von nicht-homogenen-ID-Nummern.Darüber, wo die Speicherung der integer -, ich denke, es ist die id Strategie und die versuchen und schauen Strategie.
Den id Strategie ist einfacher und schneller in die kurzfristig. Dokument-IDs sind integer (vielleicht Präfix geben Sie zum hinzufügen eines namespace). Da die Couch Eindeutigkeit auf die
_id
Feld, müssen Sie nur sorgen über die auto-increment. Tun Sie dies in einer Schleife:409 Conflict
löst eine Wiederholung201 Accepted
bedeutet, dass Sie fertig sind.Ich denke, dass die großen Schmerzen, die mit diesem trick ist, dass wenn Sie einen Konflikt bekommen, haben Sie zwei komplett verschiedenen Dokumente, und einer von Ihnen muss kopiert werden in ein frisches Dokument. Wenn es Beziehungen zu anderen Dokumenten, Sie alle müssen korrigiert werden. (Die CouchDB 0.11
emit(key, {_id: some_foreign_doc_id})
trick in den Sinn kommt.)Den versuchen und schauen Strategie verwendet die Standard-UUID als
doc._id
, so dass jeder Einsatz wird erfolgreich sein. Im Idealfall sind alle oder die meisten Ihrer inter-Dokument-Beziehungen basieren auf den unveränderlichen UUID_id
, nicht die ganze Zahl. Das ist nur für die Benutzer verwendet, und die Benutzeroberfläche. Die auto-increment-integer ist einfach ein Feld in das Dokument{"int_id":20}
. Die Ansicht macht natürlichemit(doc.int_id, null)
. (Sie können sich ein Dokument durch integer-id mit einer?key=23?include_docs=true
parameter der Ansicht.Natürlich, nach einer Replikation, die Sie haben könnten-id-Konflikte (nicht offizielle CouchDB Konflikte, sondern nur Dokumente mit dem gleichen numerischen Identifikationsnummer (id). Der Blick strahlt von ID würde sich auch verringern-phase: einfach
_count
sollte genug sein. Als Nächstes müssen Sie streife der DB-Abfragen in dieser Ansicht mit?group=true
und suchen für jede Zeile (entsprechend einer integer-id), die eine Zahl > 1. Auf der plus-Seite, korrigieren Sie die numerische id eines Dokuments ist eine geringfügige änderung, da es nicht erfordert neues Dokument erstellen.Das sind meine Ideen. Nun, ich schrieb Sie nieder, ich fühle mich wie Sie tun müssen Beziehung führen, unabhängig davon, wo die id gespeichert ist, und so vielleicht mit
_id
ist besser, nachdem alle. Der einzige andere Nachteil den ich sehe, ist, dass Sie dauerhaft verheiratet zu einem grundlegend gebrochen Benennung Modell—für eine bestimmte definition von "dauerhaft."Hatte ich ziemlich Glück nur ein iso-formatiertes Datum wie mein Schlüssel:
http://wiki.apache.org/couchdb/IsoFormattedDateAsDocId
Es ist ziemlich einfach zu tun, lesbar und es im Grunde baut in ein paar Abfragen Optionen von nur bestehende. 🙂
Gibt es einen bestimmten Grund, Sie wollen numeric-IDs über die UUIDs, dass CouchDB kann zu generieren für Sie? UUIDs sind perfekt für die verteilte Paradigma, dass CouchDB verwendet, stick mit, was eingebaut ist.
Wenn Sie finden, sich selbst mit mehr als 1 CouchDB Knoten in Ihrer Architektur, Sie kommen zu widersprüchlichen Dokument-IDs, wenn Sie sich darauf verlassen, so etwas wie "auto-increment", wenn es darum geht, Zeit für die Replikation. Auch wenn Sie nur 1 Knoten nun, das ist wohl nicht immer der Fall sein wird, vor allem, da CouchDB so gut funktioniert in einer verteilten und "offline" - Architektur.
Unter Berücksichtigung der Probleme um die Replikation und Konflikte, die Sie verwenden können, eine update-Funktion zu generieren increment-IDs sind garantiert einzigartig, in einem einzigen master-setup.
Bietet diese Funktion in einem design-Dokument so:
Dann rufe es so auf:
Ersetzen
entityId
mit dem, was Sie erstellen möchten mehrere unabhängige ID-Sequenzen.Nicht eine perfekte Lösung, aber etwas, das für mich gearbeitet. Erstellen Sie eine unabhängige Dienstleistung, generiert auto-increment-ids. Ja, Sie werden wahrscheinlich sagen "das bricht die offline-Modell von couchdb" aber was, wenn Sie bekommen einen pool von N-ids, die Sie dann verwenden können, Wann immer Sie brauchen, um ein neues auto-increment-id. Dann jedes mal, wenn Sie online sind, erhalten Sie einige mehr-ids und, wenn Sie mit out-of-ids, die Sie sagen, Ihre Benutzer - bitte gehen Sie online. Wenn der pool ist groß genug (sagen, dass die monatliche traffic) sollte dies nicht geschehen. Wieder nicht perfekt, aber vielleicht können hilfreich sein für einige Menschen.
Anstatt explizit den Bau einer Erhöhung der integer-Schlüssel, den Sie verwenden konnten, der implizite index-couchDB akzeptiert für die Auslagerungsdatei.
Den überspringen - parameter akzeptiert eine Ganzzahl, die effektiv stellen Sie den auto-increment index, den Sie gewohnt sind.
http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options
Der Nachteil ist, dass es nicht eine praktikable Lösung für "User-friendly-IDs". Der index ist nicht gebunden an den doc, und wird sich ändern, wenn Sie sind, die Geschichte umzuschreiben.
Wenn die einzige Einschränkung ist "die integration mit Bibliotheken/Systeme, bei denen die numerischen Primärschlüssel" diese Brücke wird die Lücke, ohne dabei die Vorteile von couchDB-key-Struktur.