是否可以将couchdb配置为以UUID方式以外的方式生成ID?

是否可以将couchdb配置为以UUID方式以外的方式生成ID?,couchdb,couchdb-futon,Couchdb,Couchdb Futon,是否可以将couchdb配置为以UUID方式以外的方式生成ID? 我在单个节点上使用couchdb,我理解在分布式环境中不使用UUID的缺点 我需要一些像自动递增或更短的id。我有FK参考 类似用户ID:[“16011a5704ffe78e6de2afa4b3001d10”、“55464a5704ffe78e6de2afa4b3001d10”,…] 如果我使用UUID,这可能会太长。使用UUID而不是简单的自动增量值的原因是,在使用多个节点时,减少冲突的可能性。CouchDB确实有适当的位置,您

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

我需要一些像自动递增或更短的id。我有FK参考 类似用户ID:[“16011a5704ffe78e6de2afa4b3001d10”、“55464a5704ffe78e6de2afa4b3001d10”,…]
如果我使用UUID,这可能会太长。

使用UUID而不是简单的自动增量值的原因是,在使用多个节点时,减少冲突的可能性。CouchDB确实有适当的位置,您可以从中选择生成UUID


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

您可以自己提供id,即使生成的uuid也不保证是确定的,它只是最小化了冲突的可能性,但由于您关心长度,我们可以将其缩短到16。前4个确定用户,后8个确定时间戳,最后4个可以是随机的。 使用多基转换器,可以使用字符范围
0-9a-zA-Z

  • 一旦新用户使用该系统,他将被分配一个4个字符的唯一字母数字(超过1400万个可能的前缀)
  • 接下来,我们以毫秒为单位获取当前时间,并使用上面提供的多基转换器对其进行转换(应该可以工作到8888年)
  • 最后4个字符将是一个随机生成的字符串,用于填充
  • 打破这一局面将非常困难。根据您正在构建的系统类型和考虑的最大用户数,您可以将其减少到10个(3个前缀,7个时间),甚至可以在字符列表中添加更多字符


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


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

    为什么不创建自己的ID并使用它呢?ID为空时默认为UUID。不同的服务(项目)同时使用My couchdb api。所以我没有原子检查之类的东西,并设置为查找特定id是否已经存在于数据库中。好的,所以答案是否定的。您需要找到一种方法来生成id作为应用程序基础结构的一部分,或者接受生成的id。老实说,如果您允许客户端/服务直接影响DB,那么它就不是什么API了。客户端服务调用my API(这是一个库,比如internalDBClient.jar)与CouchDB对话……所有3种算法都产生32个字符,这无法解决我的问题。我无法生成自己的id,因为不同的服务(项目)同时使用我的couchdb api。因此,我没有进行原子检查,并设置查找特定id是否已存在于数据库中。您只需调用一个HTTP
    HEAD
    请求,对您试图创建的具有
    \u id
    的文档执行请求即可。它是测试
    \u id
    是否存在的最快、开销最小的方法。您使用的节点是否超过1个?你使用过复制吗?我只使用一个节点,没有复制我们可以在验证文档更新中做一些事情来获得自动增量ID吗?
    base62 (val) {
      const SYMBOLS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
      let digs = ''
      while (val) {
        digs = SYMBOLS.charAt(val % SYMBOLS.length) + digs
        val /= SYMBOLS.length
        val = parseInt(val)
      }
      return digs
    }