拖动排序的数据存储和算法

在公司填写OKR的过程中,无意中看到了在设置KR的过程中,支持能够针对KR进行拖动排序,思考其中的实现原理,如果进行完排序,那么数据库中的数据要求是有序的,这样的话需要管理数据库中数据的排序。
那么具体的实现方式是啥样的,充满好奇心的我突然感觉这个问题并不简单。

脑海里面掠过的两种想法:

  • 实现方案1

在数据库表中设计一个字段叫做itemOrder,用来存储数据的排序:

当操作更新变更行的itemOrder来将元素放在对应的位置上。

此时新的itemOrde需要将当前元素的前置元素和后置元素的itemOrder数值取出,计算一个中间值。然后回存到当前的元素中。

至少需要查询两条数据,更新一条数据。

当插入元素的时候,根据当前数据库中存储的最大的itemOrder增加一定的量来确定新加入元素的itemOrder。

至少需要查询一条数据,更新一条数据。

假设itemOrder为整形

存在一个问题,如果将变更的元素插入到的位置不能够算出中间值  ,因为中间没有值  如果上面的元素的itemOrder为2  下面的为3  那么中间是2.5  取整为2或者3  怎么算都不对。

假设itemOrder为浮点型。

在多次拖动的情况下,同样会存在出现找不到中间数的情况。


尝试解决上面的找不到中间值的问题: 当找不到中间值的时候,将所有元素的itemOrder乘以一定的倍数后存储回去。或者将itemOrder增加一定的数值存储回去,总之是要更新很多的行。

再执行变更操作。 这个方案是可行的。此时需要更新的数据会取决于需要被排序的元素的数量。


综上所述: 该方案有一定缺陷,但是能够很快的解决问题,并且逻辑简单。在数据元素不多的情况下,是可以选用的。但是可能存在操作时间不稳定的情况。

  • 实现方案2

在数据表中设计一个字段叫做nextItem ,存储下一各元素的id值。将所有需要排序的数据组织成一个单向链表。

此时调整元素的顺序,就是修改元素的NEXT指针。平均每次调整需要更新3条数据。
整体流程如下图:

此时插入新元素的顺序就是。先插入,获取ID  ,将获取到的ID更新到非当前行的next指针为空的数据上。

这个方案有一个问题:就是当从数据库中取出数据后,数据可能是乱序的,需要根据next的顺序在代码中组织单向链表来实现呈现上的有序性。并且不可以删除数据。或者只能标记删除数据。

在删除元素的过程中,需要对链表进行更新。

综上所述: 该方案平均算法复杂度较低。并且更新比较稳定,不涉及大批量数据的更新,针对较大数据也不会出现更新批量数据的情况。是比较理想的实现方案。

剩下的方案,交给聪明的你了。

Show Comments
备案信息: 京ICP备20002019号