关于拖拽排序的后端存储设计

需求

课程 讲师 排序
课程1 1 1
课程2 1 2
课程3 1 3
课程4 1 4
课程5 1 5
课程6 1 6

可以随意调整课程顺序,如:将课程1调到课程3课程4之间

课程 排序
课程2 1
课程3 2
课程1 3
课程4 4
课程5 5
课程6 6

单次涉及变更的课程数量没有限制,大多为100以内,也有200+的,极少数超过300;
总课程数量为1千万左右

存储方案

1. mysql 直接存排序

一次变更需要多个update

1
2
update table set orderField = orderField + 1 where orderField > (select orderField from table where id = currentID)
update table set orderField = orderField + 1 where id = currentID

第一个update语句,用到了子查询,或许会很慢,可以伪造数据试一下

2. mysql 存优先级

优先级越大排序越靠前

ID 课程 优先级
1 课程1 6
2 课程2 5
3 课程3 4
4 课程4 3
5 课程5 2
6 课程6 1

课程1调到课程3课程4之间,为方便处理,让优先级为float(否则和排序方案1并无区别)

ID 课程 优先级
2 课程2 5
3 课程3 4
1 课程1 3.5
4 课程4 3
5 课程5 2
6 课程6 1

但总有可能,多个id的优先级一样,不是很稳妥

3. redis list

利用reids的列表

1
2
3
4
# 将`课程1`的ID加到`课程3`和`课程4`之间
LINSERT lecture:list BEFORE "课程4-ID" "课程1-ID"
# 删除`课程1`的ID
LREM lecture:list 1 value "课程1-ID"

先去查redis,再根据列表顺序排序

4. mysql json:list

思路和方案3差不多,只是列表改为mysql的json实现,不知道具体效率如何

5. mysql 最暴力,逐条update

实际查看原来的项目后,发现用的是for循环多次调用update…非常不建议…

对比

讲师课程,数量 100

方案 查看课程列表 倒序 末位->中间 中间->首位 末位->首位
1 1 1 1 1 1
2 2 1 1 1 1
3 3 1 1 1 1
4 4 1 1 1 1
5 5 1 1 1 1

讲师课程,数量 200

方案 查看课程列表 倒序 末位->中间 中间->首位 末位->首位
1 1 1 1 1 1
2 2 1 1 1 1
3 3 1 1 1 1
4 4 1 1 1 1
5 5 1 1 1 1

讲师课程,数量 300

方案 查看课程列表 倒序 末位->中间 中间->首位 末位->首位
1 1 1 1 1 1
2 2 1 1 1 1
3 3 1 1 1 1
4 4 1 1 1 1
5 5 1 1 1 1
坚持原创技术分享,您的支持将鼓励我继续创作!