需求
课程 | 讲师 | 排序 |
---|---|---|
课程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 直接存排序
一次变更需要多个update1
2update 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 |