【问题标题】:Marklogic : Generate primary key while data ingestionMarklogic:在数据摄取时生成主键
【发布时间】:2016-10-21 15:32:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: marklogic marklogic-8 marklogic-7


    【解决方案1】:

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

    【讨论】:

    • 感谢 Hunterhacker 的回复。
    • @hunterhacker 这并非在所有情况下都是正确的。作为一个数据库,它应该能够提供一种生成序列/随机数的方法。就像在 Mongo DB 中一样,它为每个唯一的插入生成 _id 对象。 MarkLogic 中没有类似的东西吗?
    • 有没有办法可靠地生成序列?绝对地!您想为唯一 ID 执行此操作吗?不。因为它增加了开销而没有任何好处,而且你的智能代码有一个错误的几率比一个大的随机值与另一个发生冲突的几率要高得多。顺便说一句,MongoDB 不进行数据库内检查。 Mongo _id 是在 client-side 构建的,“是一个 12 字节的值,由 4 字节的时间戳(自纪元以来的秒数)、3 字节的机器 id、2 字节的进程 id 组成,和一个 3 字节计数器”,每个 stackoverflow.com/questions/5817795/…。重置你的时钟,祝你好运......
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多