CouchDB / PouchDB中的任意文档排序

艾哈迈德·法西(Ahmed Fasih)

我正在使用CouchDB / PouchDB构建可被视为幻灯片应用程序的应用程序:每个“幻灯片”都是其自己的Couch文档,可以对幻灯片进行重新排序或删除,并且可以在现有幻灯片之间或开头或开头添加新的幻灯片。幻灯片的结尾。一张幻灯片可以从一张幻灯片增加到10,000英镑,因此我对时空效率很敏感。

我首先进行了幻灯片创建/编辑功能,完全低估了跟踪幻灯片订购的难度。这很困难,因为每个幻灯片文档的顺序完全独立于幻灯片文档本身,也就是说,这不是我可以按时间或文档中包含的数字排序的内容。我在StackOverflow上看到许多有关如何跟踪关系数据库中的排序的问题:

但所有这些都涉及

  1. 使用浮点辅助键进行重新排序/创建/删除,并对索引进行定期归一化(即,假设两个文档的顺序索引为1.0和2.0,然后第三个文档之间的第三个文档获取键1.5,然后第四个文档获取键1.25,… ,直到在两者之间插入〜31个文档,然后您会遇到浮点精度问题);
  2. 一种链接列表方法,其中幻灯片文档的previousandnext字段在文档的任一侧均包含文档的主键;
  3. 一种非常直接的方法,用于针对每个文档重新排序/插入/删除操作更新所有文档。

这些都不适合CouchDB:#1在SQL或CouchDB中引起大量的附带复杂性。#2由于缺少原子事务而不可靠(CouchDB可能会用新的文档更新前一个文档,next但另一个客户端可能同时更新了新的下一个文档,因此更新新的下一个文档将失败并显示409,并且您的链接列表保留在状态不一致)。出于同样的原因,#3完全不可行。


我正在评估的一种面向CouchDB的方法将创建一个仅包含幻灯片顺序的文档:它可能包含一个主键到订单号哈希对象以及一个将订单号到订单数转换的数组。主键,并且仅在重新排序/插入/删除幻灯片时更新此对象。不利的一面是,Couch会在每次订单更改(重新订购/插入/删除)时保留这个可能很大的文档的副本-CouchDB不支持仅压缩单个文档,我不想在我的文档上运行压缩整个数据库,因为我喜欢保留每个幻灯片文档的历史记录。另一个缺点是,经过成千上万张幻灯片之后,对顺序的每次更改都涉及将整个对象(数百千字节)从PouchDB /客户端传输到Couch。

该方法的一个调整方法是创建另一个数据库,以仅保存此订购文档并在其上启用自动压缩。跟踪两个数据库连接将需要做更多的工作,最终我将不得不在网络中放置大量数据,但是我将拥有一种健壮的方式来在CouchDB中订购文档。


所以我的问题是:CouchDB人员通常如何存储文档的顺序?更有经验的CouchDB员工可以看到我上面概述的方法中的任何缺陷吗?

艾哈迈德·法西(Ahmed Fasih)

感谢@LynHeadley的技巧,我结束了编写一个可以细分字符串之间的字典间隔的库:Mudder.js这样,通过随意创建新密钥,我可以在CouchDB中无限地插入和移动文档,而无需花费任何用于存储顺序的辅助文档。我认为这是解决此问题的正确方法!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章