Marklogic:在数据摄取时生成主键

时间:2016-06-20 11:32:58

标签: marklogic marklogic-8 marklogic-7

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

  

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

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

请建议我如何处理此用例。

2 个答案:

答案 0 :(得分:3)

建议的方法是使用随机生成的ID值,其长度足以使碰撞机会对您的数据集大小不切实际。因为你是人类,你仍然会被诱惑去检查碰撞,但是数学说它只是浪费。如果你使用的是64位随机值,则在40亿之后你有50/50的碰撞几率。风险太大了?使用128位随机值,如果这是令人担忧的,因为它在18千万亿之后的赔率是50/50。看到 “Probability of 64-bit hash code collisions

答案 1 :(得分:2)

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

如果从CSV批量上传数据,另一种方法是使用记录的偏移量(行或行#)作为URL的一部分,以及每个文件的唯一内容,例如文件名。 CSV数据本身通常有一列或一组列,表示该数据集的主键。这也可以使用。