Marklogic: генерировать первичный ключ при приеме данных
Я принимаю данные из CSV, используя Java-API. Я должен поддерживать первичный ключ каждого документа.
Предоставляет ли marklogic уникальный автоматически генерируемый идентификатор во время вставки?
Если marklogic не предоставляет, то я могу думать об одной вещи, которая является случайным образом сгенерированным числом hexString, но проблема в том, что если у меня есть большое количество записей в CSV для загрузки, иногда это случайное число может повториться.
Пожалуйста, предложите мне, как продолжить этот вариант использования.
2 ответа
Рекомендуемый подход состоит в том, чтобы использовать случайно сгенерированные значения идентификаторов, достаточной длины, чтобы вероятность столкновения была непрактичной для размера вашего набора данных. Поскольку вы человек, у вас все еще будет соблазн проверить наличие столкновений, но математика говорит, что это просто расточительно. Если вы используете 64-битное случайное значение, то вероятность столкновения составляет 50/50 после 4 миллиардов. Слишком рискованно? Используйте случайное 128-битное значение, если это беспокоит, потому что тогда шансы 50/50 после 18 квадриллионов. Смотрите раздел " Вероятность столкновений с 64-битным хеш-кодом "
xdmp:random() - это 64-битный генератор псевдослучайных данных (PRNG) со свойствами такового, использующий реализацию, совместимую с FIPS, когда она доступна. Это то же самое, что используется внутри для генерации IDS документа и фрагмента. Таким образом, на практике вы не можете добиться лучшего по сравнению с эффективным генерированием уникальных идентификаторов. И да, это то, что большинству людей сначала трудно принять (включая меня).
Теперь это не то же самое, что гарантия в каком-то определенном контексте, и то, что вы используете это, генерирует уникальные URI (которые являются версией ML GUID или "первичного ключа" для всей базы данных). Для этого вы должны гарантировать, что единственным источником URI являются те, которые вы генерируете, и что вы в полной мере используете все 64 бита. Если вы хотите доказать себе, что он абсолютно уникален, независимо от того, что происходит, то вам нужен какой-то транзакционный атомный счетчик. Это легко сделать (документ чтение-обновление-запись-фиксация одного общего документа), но это ужасно медленно в масштабе.
Другой вариант, если данные загружаются из CSV в пакетном режиме, - это использовать смещение (номер строки или строки) записи как часть URL-адреса и что-то уникальное в каждом файле, например, его имя файла.
Часто сами данные CSV имеют столбец или комбинацию столбцов, которые представляют первичный ключ для этого набора данных. Это также может быть использовано.