3

我正在使用 java-api 从 CSV 摄取数据。我必须维护每个文档的主键。

marklogic 在插入期间是否提供任何唯一的自动生成的 id?

如果 marklogic 不提供,那么我可以想到一件事,即随机生成的 hexString 数,但问题是如果我在 CSV 中有大量记录要摄取,有时这个随机数可能会重复。

请建议我如何处理这个用例。

4

2 回答 2

3

建议的方法是使用随机生成的 ID 值,其长度足以使冲突的可能性对于您的数据集大小不切实际。因为你是人类,你仍然会很想检查碰撞,但数学表明这简直是浪费。如果您使用的是 64 位随机值,那么在 40 亿次之后您有 50/50 的碰撞几率。风险太大?如果这令人担忧,请使用 128 位随机值,因为在 18 万亿之后它的赔率是 50/50。请参阅“ 64 位哈希码冲突的概率

于 2016-06-20T15:01:43.897 回答
2

xdmp:random() 是一个 64 位伪随机生成器 (PRNG),具有此类属性,在可用时使用符合 FIPS 的实现。它与内部用于生成文档和片段 IDS 的相同。因此,在实践中,您无法更好地有效地生成唯一 ID。是的,这是大多数人一开始很难接受的事情(包括我自己)。
现在,这不一定与在某些特定上下文中保证相同,并且您使用它会生成唯一的 URI(这是 ML 的 GUID 版本或数据库范围的“主键”)。为此,您必须保证 URI 的唯一来源是您生成的那些,并且您充分利用了所有 64 位。如果您想向自己证明无论发生什么事情它都是绝对独一无二的,那么您需要某种事务原子计数器。这些很容易制作(单个共享文档的文档读取-更新-写入-提交),但这在规模上非常缓慢。

如果数据是从 CSV 批量上传的,另一种选择是使用记录的偏移量(行号或行号)作为 URL 的一部分,以及每个文件的独特之处,例如文件名。
通常 CSV 数据本身具有代表该数据集主键的列或列组合。那也可以用。

于 2016-06-20T20:57:43.117 回答