【问题标题】:Is it possible to configure couchdb to generate ids other than the UUID way?是否可以将 couchdb 配置为生成 UUID 方式以外的 id?
【发布时间】:2013-08-10 15:26:29
【问题描述】:

是否可以配置 couchdb 以生成 UUID 以外的 id 方式? 我在单个节点上使用 couchdb,我了解不将 UUID 用于分布式环境的缺点。

我需要像自动增量或更短的 id 之类的东西。我有 FK 参考资料 像 userIds : ["16011a5704ffe78e6de2afa4b3001d10", "55464a5704ffe78e6de2afa4b3001d10", ... ] 如果我使用 UUIDS 可能会太长..

【问题讨论】:

  • 为什么不直接创建自己的 ID 并使用它呢? ID为空时默认为UUID。
  • 我的 couchdb api 被不同的服务(项目)同时使用。所以我没有像原子检查那样的东西并设置来查找特定的 id 是否已经存在于数据库中。
  • 好的,所以答案是否定的。您需要找到一种方法来生成 ID 作为应用程序基础架构的一部分,或者接受生成的 ID。
  • 而且,老实说,如果您允许客户端/服务直接影响数据库,那么它实际上并不是一个 API。
  • 客户端服务调用我的 api(这是一个库,比如 internalDBClient.jar)来与 CouchDB 对话...

标签: couchdb couchdb-futon


【解决方案1】:

您可以自己提供您的 ID,即使生成的 UUID 也不能保证没有冲突,它只是将冲突的可能性降到最低,但由于您担心长度,我们可以将其缩短为 16。前 4 个确定用户,下 8 个确定时间戳,最后 4 个可以是随机的。 使用this多基转换器,可以使用0-9a-zA-Z的char范围

  1. 一旦新用户使用系统,他将被分配一个由 4 个字符组成的唯一字母数字(超过 1400 万个可能的前缀)
  2. 接下来,我们以毫秒为单位获取当前时间,并使用上面提供的多基转换器对其进行转换(应该适用于高达 8888 年的时间)
  3. 最后 4 个字符将是一个随机生成的字符串,仅用于填充。

要打破它非常困难。根据您正在构建的系统类型和您正在考虑的最大用户数,您可以将其减少到 10 个(3 个前缀,7 次),甚至可以将更多字符 (-_) 添加到您的字符列表中。


编辑 这是我自己的实现 在我的解决方案中,每个用户一旦被管理员添加,就已经有一个唯一的前缀,并且管理员创建的用户不超过 10 个。根据创建的数据类型,使用唯一字符作为前缀。然后这是我转换当前时基62的方法。最后,我附加了一个随机字符。 `

base62 (val) {
  const SYMBOLS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  let digs = ''
  while (val) {
    digs = SYMBOLS.charAt(val % SYMBOLS.length) + digs
    val /= SYMBOLS.length
    val = parseInt(val)
  }
  return digs
}

单个用户不能同时在同一类别下创建两条记录,即使他这样做了,也很少会生成相同的随机附加字符。

【讨论】:

    【解决方案2】:

    使用 UUID 而不是简单的自动递增值的原因是为了减少使用多个节点时发生冲突的可能性。 CouchDB 确实有 3 different algorithms,您可以从中选择用于生成 UUID。

    如果您需要其他 id 格式,您始终可以定义自己的 _id 字段,因为只有在未定义 _id 时才会调用 uuid 生成器。

    【讨论】:

    • 所有 3 种算法都会产生 32 个字符,这无法解决我的问题。我无法生成自己的 id - 我的 couchdb api 同时被不同的服务(项目)使用。所以我没有原子检查并设置来查找特定的 id 是否已经存在于数据库中。
    • 您可以针对您尝试创建的带有_id 的文档调用HTTP HEAD 请求。这是测试_id 是否存在的最快、开销最小的方法。
    • 您是否使用超过 1 个节点?你曾经使用过复制吗?
    • 我只使用 1 个节点,没有复制
    • 我们可以在 validate_doc_update 中做某事来获取自动增量 ID 吗?
    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多