我正在使用带有node.js的CouchDB。现在有一个节点参与,即使在遥远的未来,它也没有计划改变它。虽然我可以删除大多数需要短和自动增量(可能是稀疏但不像随机)ID的情况,但仍有一个地方用户实际需要输入产品的ID。我希望将此ID尽可能地缩短,并且采用比人类更易读的格式,如#4; 4ab234acde242349b'因为它有时必须手工输入等等。
然而,在数据库中它可以存储任何ID喜欢CouchDB(使用默认的自动生成的UUID)但是应该可以给它一个可以用来识别它的数字。我想到的是创建一个文档,其中包含一个包含CouchDB中所有UUID的数组。当在节点I中创建新产品时,我将运行更新处理程序,该处理程序在最后使用新的唯一ID更新所述文档。要获取产品ID I,然后使用indexOf查询数组和客户端,我可以将索引作为短ID。
我不知道这是否可行。从性能的角度来看,我可以说如下:有更多的查询应该做数字ID - > uuid比uuid - >数字ID。数据库中每年最多有7000个新条目。此外,没有用于删除产品的用例,但我不想依赖它。
是否还有其他适用的方法来生成与我的文档相关联的更短且更易读的ID?
/修改 从技术角度来看:它似乎有效。我可以同时执行转换编号< - > uuid似乎进展顺利。我现在不知道如果这对复制和东西有效,但是因为有所说的数组我想它应该,对吧?
答案 0 :(得分:1)
你有两个选择:
将您的人类可读ID设置为_id
字段。基本上你可以设置创建文档调用DB,它会接受它。这可能是一个更轻量级的解决方案,但它有一些限制:
如果这些事情对您没有问题,那么您应该采用这种解决方案。
正如您所说,让_id
成为UUID,并将人类可读的ID设置为另一个字段。要通过人类可读的ID访问文档,您只需创建一个view,将人类可读的ID作为键发出,然后将文档作为值发出或通过include_docs=true
选项获取文档。每当到达视图时,Couchdb将逐步更新视图并返回列表。这与您在其中创建具有ids数组/对象的文档非常相似。除了使用couchdb视图外,您还可以获得更高的性能。
查询和插入时可能会稍慢一些。如果按顺序插入ID,则可以,CouchDB will slightly take more time to insert it at the right place。这些不适用于DB上的大量插入物。
查询的总查询时间不应超过第一个选项的10%。我认为10%真的是一个很大的数字。它很可能不到5%,我记得在我的CouchDB应用程序中,我从_id读取切换到按键查看视图,从用户端点开始减速很少,当在同时,它并不明显。
这是人们在用户登录时通过其他字段查询文档的方式,例如用电子邮件查询用户文档。
如果您不知道couchdb视图的工作原理,请阅读views chapter的couchdb definite guide book。
还要确保远离包含大量阵列的文档。我认为CouchDB每个文件的限制为4GB。我记得有很多文档,它有很长的查询时间,因为视图必须迭代每个数组项。最后,我为每个数组项创建了一个文档。它更快。