2016-06-20 14 views
3

Ich nehme Daten von CSV mit Java-API. Ich muss den Primärschlüssel jedes Dokuments beibehalten.Marklogic: Genarate Primärschlüssel während der Datenaufnahme

Bietet marklogic eine eindeutige automatisch generierte ID beim Einfügen an?

Wenn Marklogic bieten nicht dann kann ich an eine Sache denken, die zufällig hexstring Zahl aber Problem erzeugt wird, ist, wenn ich große Anzahl von Datensatz in CSV haben aufnehmen, irgendwann diese Zufallszahl könnte wiederholen.

Bitte schlagen Sie mir vor, wie Sie mit diesem Anwendungsfall fortfahren.

Danke fürs Lesen.

Antwort

3

Der empfohlene Ansatz besteht darin, die zufällig generierten ID-Werte zu verwenden, die so lang sind, dass die Wahrscheinlichkeit einer Kollision für Ihre Datensatzgröße nicht praktikabel ist. Weil Sie ein Mensch sind, werden Sie immer noch versucht sein, nach Kollisionen zu suchen, aber Mathematik sagt, es ist einfach verschwenderisch. Wenn Sie einen zufälligen 64-Bit-Wert verwenden, haben Sie eine Wahrscheinlichkeit von 50/50 einer Kollision nach 4 Milliarden. Zu riskant? Verwenden Sie einen zufälligen 128-Bit-Wert, wenn das besorgniserregend ist, denn dann sind es 50/50 Chancen nach 18 Billiarden. Siehe "Probability of 64-bit hash code collisions"

+0

Dank hunterhacker für die Antwort. – RCS

+1

@hunterhacker Das stimmt nicht in allen Fällen richtig. Als Datenbank sollte es möglich sein, eine Sequenz/Zufallszahlen zu generieren. Wie in Mongo DB generiert _id Objekt für jede Einfügung, die einzigartig ist. Ist MarkLogic nicht ähnlich? – DMA

+0

Gibt es eine Möglichkeit, eine Sequenz zuverlässig zu generieren? Absolut! Möchten Sie das für eindeutige IDs tun? Nein. Weil es Overhead für keinen Nutzen bringt, und es gibt viel bessere Chancen, dass Ihr Smart Code einen Fehler hat, als ein großer zufälliger Wert mit einem anderen kollidiert. MongoDB führt keine datenbankinterne Überprüfung durch. Die Mongo_id ist * clientseitig * und "ist ein 12-Byte-Wert, der aus einem 4-Byte-Zeitstempel (Sekunden seit der Epoche), einer 3-Byte-Maschinen-ID, einer 2-Byte-Prozess-ID und einem 3-Byte besteht counter "per http://stackoverflow.com/questions/5817795/how-are-mongodbs-objectids-generated. Setzen Sie Ihre Uhr zurück und viel Glück ... – hunterhacker

2

xdmp: random() ist eine 64-Bit-Pseudo-Zufallsgenerator (PRNG) mit den Eigenschaften von solchen, FIPS konformen Implementierung verwendet, wenn verfügbar. Es ist das gleiche wie intern für das Generieren von Dokument- und Fragment-IDs verwendet. In der Praxis können Sie also keine bessere Generierung eindeutiger IDs erzielen. Und das ist etwas, was die meisten Leute zuerst schwer akzeptieren (ich selbst eingeschlossen).
Nun, das ist nicht unbedingt das Gleiche wie das Gewähren in einem bestimmten Kontext und dass Ihre Verwendung von diesem einzigartige URIs generiert (was die ML-Version einer GUID oder eines datenbankweiten Primärschlüssels ist). Um dies zu tun, müssen Sie garantieren, dass die einzige Quelle von URIs die Sie generieren und dass Sie alle 64 Bits voll ausnutzen. Wenn Sie sich selbst beweisen wollen, dass es absolut einzigartig ist, egal was vor sich geht, dann brauchen Sie einen Transaktions-Atomzähler in irgendeiner Form. Das sind leicht gemacht (ein Dokument lesen-update-write-commit von einzelnen gemeinsamen Dokument), aber das ist schrecklich langsam im Maßstab.

Eine andere Alternative, wenn die Daten im Stapel von CSV hochgeladen werden, ist die Verwendung des Versatzes (Zeile oder Zeile #) des Datensatzes als Teil der URL und etwas Einzigartiges über jede Datei, wie der Dateiname.
CSV-Daten selbst enthalten oft eine Spalte oder eine Kombination von Spalten, die einen Primärschlüssel für dieses Dataset darstellen. Das kann auch verwendet werden.