Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 存储中记录的灵活排序_Algorithm_Sorting_Data Structures - Fatal编程技术网

Algorithm 存储中记录的灵活排序

Algorithm 存储中记录的灵活排序,algorithm,sorting,data-structures,Algorithm,Sorting,Data Structures,我们的存储统计中有很多记录,应该保持有序。 这些记录通过常用的CRUDAPI进行管理:因此用户可以添加新记录、更改现有记录的顺序等。我们用于记录的存储不是事务性的(实际上是MongoDB)。当记录被更新时,我们为其触发事件,以便消费者可以实际使用API获取更新版本的记录 让我再次强调这一点:记录在CRUD应用程序中进行修改时,以及通过事件读取状态的消费者,都应该保持有序 如果我们决定使用某个整数字段来跟踪记录顺序,那么当某些记录的顺序发生更改时,我们必须更新许多记录。例如,我们有 Fox ord

我们的存储统计中有很多记录,应该保持有序。 这些记录通过常用的CRUDAPI进行管理:因此用户可以添加新记录、更改现有记录的顺序等。我们用于记录的存储不是事务性的(实际上是MongoDB)。当记录被更新时,我们为其触发事件,以便消费者可以实际使用API获取更新版本的记录

让我再次强调这一点:记录在CRUD应用程序中进行修改时,以及通过事件读取状态的消费者,都应该保持有序

如果我们决定使用某个整数字段来跟踪记录顺序,那么当某些记录的顺序发生更改时,我们必须更新许多记录。例如,我们有

Fox order=1
Bear order=2
Cat order=3
然后我们决定添加袋熊作为第二条记录-我们必须更新熊和猫的顺序:

Fox order=1
Wombat order=2
Bear order=3
Cat order=4
想象一下,如果有很多记录以这种方式进行移动,这可能会成为一个严重的问题,因为我们将为所有这些记录触发更改事件,用户基本上必须重新同步整个存储

如果我们采用链表方法(每条记录都跟踪其相邻记录),那么重新排序就会变得更容易,但消费者会发现自己处于不一致的状态。例如,我们有:

Fox next=Bear previous=none
Bear next=Cat previous=Fox
Cat next=none previous=Bear
然后我们添加袋熊作为第二条记录:

Fox next=Wombat previous=none
Wombat next=Bear previous=Fox
Bear next=Cat previous=Wombat
Cat next=none previous=Bear
问题是,消费者可以在实际获得关于创建袋熊的事件之前,首先获得福克斯改变的事件,其下一个记录是袋熊。如果使用者此时执行某些聚合操作,它将失败,因为它的记录副本不一致


是否有任何结构或方法可以使记录保持有序,允许任意插入/重新排序/删除,但又不需要进行交易?

可能是一个单独的记录来存储订单?例如,如果您删除了一条记录,而有人在您更新订单记录之前抓取了该订单记录,则这也将是不一致的:订单记录将显示一条不存在的记录。如果您插入一条记录,并且客户机在您更新它之前获得了排序,那么同样的情况也会发生:客户机将看不到新记录。但是,当您使用非事务性数据存储时,您必须接受这一点。解决这个问题的一种方法是让客户机为数据调用API。基本上,非事务性和完美一致性是相互排斥的要求。如果你想要完美的一致性,那么你必须去事务性的。如果您想要非事务性的,那么您必须接受不一致的可能性。可能是存储订单的单独记录?例如,如果您删除了一条记录,而有人在您更新订单记录之前抓取了该订单记录,则这也将是不一致的:订单记录将显示一条不存在的记录。如果您插入一条记录,并且客户机在您更新它之前获得了排序,那么同样的情况也会发生:客户机将看不到新记录。但是,当您使用非事务性数据存储时,您必须接受这一点。解决这个问题的一种方法是让客户机为数据调用API。基本上,非事务性和完美一致性是相互排斥的要求。如果你想要完美的一致性,那么你必须去事务性的。如果您想要非事务性的,那么您必须接受不一致的可能性。