logo科技微讯

如何保存由用户自定义的排序

作者:科技微讯
日期:2022-07-29
📝 笔记

写“通知中心”的时候遇到一个问题:打卡提醒一旦多了,如果采用自动排序(按照某个 key 排序)体验很不好,所以我希望增加用户自定义排序功能,这意味着我需要把由用户自定义的排序信息保存到数据库中。

Google 一下首先找到了这个问题:mongodb 怎么设计用户自定义的排序列表?(How to implement an orderable list)。提问者给出了一篇标题为 User-defined Order in SQL 的文章,介绍了 4 种解决这个问题的方法,虽然说的是 sql,但解决思路对 mongodb 也有参考价值:

  • 最先想到的肯定是每一个项目增加一个 1、2、3 这样的序列递增数字作为位置字段,但是把一个项目从某个位置挪到另一个位置,需要更新多个文档的位置字段,这种方法首先排除;
  • 不用递增数字,而是用有间隔的数字,调整文档顺序时,把该文档的位置字段设置为前后两个文档的位置字段的平均值;
  • 上面这种方法用的是整数作为位置字段的值,也可以改用小数,但小数小到一定程度后就无法区分,因为编程语言的精确度有限;
  • 用 Stern-Brocot tree 结构,把位置字段改成 Stern-Brocot 分数,其实也是把位置字段改为前后两个位置字段中间的某个值,但不是平均值;
  • 把 Stern-Brocot 分数转换为浮点数;

User-defined Order in SQL 这篇文章在 hacker news被讨论了,有人提到可以用 mudder 生成的字符串进行排序。

mudder 的 npm 包下载了很多不需要用到的文档,可以直接去它的 github 下载打包好的 mudder.cjs 文件,改为 js 后缀,就可以在小程序和 nodejs 引入使用了。mudder 的作用,用作者的话来说:

Handy for ordering NoSQL keys. In NoSQL databases like CouchDB or Redis, entries are indexed by stringy keys and I needed a way to reliably insert, delete, and reorder entries to maintain an external ordering without knowing ahead of time how many entries or how they would be ordered.

mudder.js 的 github 举了多个例子来说明 mudder.js 怎么用。

刚开始设计一个数据库,刚开始有 10 个文档,后续几乎所有新文档都默认保存在这 10 个文档后面,可以参考 Bolanle 的例子,刚开始的 10 个 key 建议这样生成:

var keys = mudder.base62.mudder(99).slice(0, 10);

如果后续几乎所有文档都保存在这 10 个文档之前:

var keys = mudder.base62.mudder(99).slice(-10)
donation赞赏
thumbsup0
thumbsdown0
暂无评论