Database NoSQL存储可重新排序的元素列表

Database NoSQL存储可重新排序的元素列表,database,nosql,Database,Nosql,我的NoSQL设置如下: UserId : ContentId : OrderId User1 : Content1 : 0 User1 : Content2 : 1 User2 : Content3 : 0 User2 : Content4 : 1 User2 : Content5 : 2 User2 : Content6 : 3 User2 : Content7 : 4 我得到了User2项的列表,这些项按照 SELECT * FROM table WHERE

我的NoSQL设置如下:

UserId : ContentId : OrderId
User1  : Content1  : 0 
User1  : Content2  : 1
User2  : Content3  : 0
User2  : Content4  : 1
User2  : Content5  : 2
User2  : Content6  : 3
User2  : Content7  : 4
我得到了User2项的列表,这些项按照

SELECT * FROM table WHERE UserId = 'User2' SORT BY OrderId DESC
导致

UserId : ContentId : OrderId
User2  : Content3  : 0
User2  : Content4  : 1
User2  : Content5  : 2
User2  : Content6  : 3
User2  : Content7  : 4
太好了!现在我想交换,使表如下所示:

UserId : ContentId : OrderId
User2  : Content3  : 0
User2  : Content6  : 3
User2  : Content4  : 1
User2  : Content5  : 2
User2  : Content7  : 4
因此,我将
Content6
移动到
Content3
之后和
Content4
之前。现在的缺点是要更新
OrderId
我必须更新
Content3
之后的每一行,从而导致对数据存储的多次写入


在NoSQL数据库中执行此操作的更好方法是什么?

您可以使用更复杂的算法来解决此问题,您可以在键之间创建一个较大的间隙,然后可以将项从一个位置移动到其他键之间

过一段时间后,一些空间可能会用完,因此在这种情况下,算法将必须规范化表,甚至键之间的间隙,从而导致一次性过程,这将对数据库造成更大的负担。例如,当您检测到正在运行/耗尽空间时,可以定期或根据需要执行此操作

因此,原始表将如下所示:

以前

UserId : ContentId : OrderId
User2  : Content3  : 0
User2  : Content4  : 1000
User2  : Content5  : 2000
User2  : Content6  : 3000
User2  : Content7  : 4000
之后


在一个好的NoSQL解决方案中,大规模更新是没有问题的,因为在后台,更新看起来像是一个附加到一个文件中的文件,通常称为写前日志。例如,如果您发布1000000个更新,并且每个更新的大小(例如)为32字节,那么它将导致仅向文件写入32MB,即使在磁盘上也可以在不到1秒的时间内完成。此外,如果所有这些更新都在一个事务中,那么这应该正好是一个具有大缓冲区的写/写系统调用。

我必须说,如果这是针对一个可显示列表的,该列表中的项目不会超过几十个,并且您不希望每天对项目订单进行数千次更新,那么对数据存储的多次写入是不可能的性能方面可能可以忽略不计,所以您不应该为此而烦恼。解决此问题的另一种方法是以链表方式存储项目,使每个项目指向下一个项目,然后以扫描整个表的性能为代价快速移动项目。谢谢,我考虑过链表解决方案,但是,如何轻松地执行按顺序查询,以按OrderId的顺序提取行?是的,OrderBy不适用于链接列表,在读取行时,您需要做大量的数据库工作或内存工作来对行进行排序,因此使用链接列表可以实现快速移动和慢速读取。
UserId : ContentId : OrderId
User2  : Content3  : 0
User2  : Content6  : 500
User2  : Content4  : 1000
User2  : Content5  : 2000
User2  : Content7  : 4000