Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 在后端数据库中对用户定义的排序顺序进行编码的合理方法?_Firebase_Sorting_Firebase Realtime Database_Google Cloud Firestore_Nosql - Fatal编程技术网

Firebase 在后端数据库中对用户定义的排序顺序进行编码的合理方法?

Firebase 在后端数据库中对用户定义的排序顺序进行编码的合理方法?,firebase,sorting,firebase-realtime-database,google-cloud-firestore,nosql,Firebase,Sorting,Firebase Realtime Database,Google Cloud Firestore,Nosql,我在一个集合中有一系列“行”,它们被持久化到nosql数据库(在本例中为Firestore)。“我的每一行”都有一个排序顺序,当用户随集合添加、插入、复制或移动行时,会建立该排序顺序。用户可以在其中插入新记录的插入点是任意的。排序顺序将保留到后端,并可通过排序顺序字段按顺序检索。集合中可能有大量行,顺序为50K 问题是什么样的排序顺序编码格式允许在现有记录之间重复插入新记录,而不必偶尔重写整个集合的排序索引,以便在相邻记录之间的排序顺序中提供“空间” 我猜可能有一些标准的方法来实现这一点,但不确

我在一个集合中有一系列“行”,它们被持久化到nosql数据库(在本例中为Firestore)。“我的每一行”都有一个排序顺序,当用户随集合添加、插入、复制或移动行时,会建立该排序顺序。用户可以在其中插入新记录的插入点是任意的。排序顺序将保留到后端,并可通过排序顺序字段按顺序检索。集合中可能有大量行,顺序为50K

问题是什么样的排序顺序编码格式允许在现有记录之间重复插入新记录,而不必偶尔重写整个集合的排序索引,以便在相邻记录之间的排序顺序中提供“空间”

我猜可能有一些标准的方法来实现这一点,但不确定它是什么。

假设字母表是“abc”。然后:

b、 c,cb

是一个按字典排序的列表,允许您在任意位置插入项目:

ab,b,bb,c,cab,cb,cbb

结果仍然是一个列表,允许您在任意位置插入项目:

aab,ab,ac,b,bab,bb,bc,c,caab,cac,cac,cb,cbab,cbb,cbbb

诀窍是避免将“a”作为项目的最后一个字符,这样您就可以始终将项目置于其他项目之后

使用64个ASCII字符而不是3个字符执行此操作

我已经想了好几个月了。这是我迄今为止在实施该计划方面取得的进展。它仍然有一些缺陷,有点乱,但我想我会清理它,并在npm上传它,当我找到更多的时间

//最初是用TypeScript编写的,然后删除了SO的类型。
常量字母='abc';
函数getHigherAsciiChar(char){
常量索引=字母表索引(字符);
如果(索引===字母表长度-1){
返回“”;//对不起,没有更高的字符
}
const nextIndex=Math.ceil((索引+字母表长度-1)/2);
返回字母.charAt(nextIndex);
}
函数getCharBetween(minChar、maxChar){
if(minChar>maxChar){
抛出新错误('minChar>maxChar,'+minChar+'>'+maxChar);
}
const minIndex=字母表索引(minChar);
const maxIndex=字母表索引(maxChar);
常数nextIndex=数学层((最小索引+最大索引)/2);
如果(nextIndex==minIndex){
返回“”;//这两个字符之间没有字符
}
返回字母.charAt(nextIndex);
}
函数getPaddedString(最终长度,字符串){
让结果=字符串;
while(result.length{};//取消注释此项以记录调试内容
如果(!bounds.previous&&!bounds.next){
返回getHigherAsciiChar(字母表[0]);
}
const previousString=bounds.previous | |“”;
如果(!bounds.next){
const firstPreviousChars=previousString.substr(0,previousString.length-1);
const lastPreviousChar=previousString.charAt(previousString.length-1);
返回firstPreviousChars+(
getHigherAsciiChar(lastPreviousChar)|(
lastPreviousChar+getHigherAsciiChar(字母表字符(0))
)
);
}
const nextString=bounds.next;
log(`在'${previousString}'和'${nextString}'之间搜索…`);
const bigStringLength=Math.max(上一个string.length,下一个string.length);
const previous=getPaddedString(bigStringLength,previousString);
const next=getPaddedString(bigStringLength,nextString);
console.log(上一个,下一个);
让结果=“”;
让我;
对于(i=0;i=结果;i++){
const previousChar=previous.charAt(i);
const higherChar=gethigherascichar(previousChar);
如果(更高){
//您发现一个数字使结果大于下限。完成。
结果+=高热量;
log(结果是“一个更高的字符.RETURING”);
返回结果;
}
//数字仍然非常接近,无法找到中间的数字(尚未)
结果+=先前的字符;
log(结果“移动到下一位”);
}
//所以你最终耗尽了下界的所有字符槽。嗯,只需添加任何字符。
结果+=getHigherAsciiChar(字母表字符(0));
log(结果是“meh,只需添加任何字符。返回”);
返回结果;
}
功能交织测试(顺序){
常数newOrder=[];
push(getOrderString({next:order[0]}));
for(设i=0;i