文章目录
- 一、需求
- 二、设计实现
- 三、其他设计
一、需求
需求:可以自定义排序
- 可以将一个记录移动到另一记录的上方或下方
- 可以置顶
原型,如下:
姓名 | 手机号 | 操作(排序) |
滴滴 | +86-13444444444 | 移动 |
啦啦 | +86-13444444445 | 移动 置顶 |
哈哈 | +86-13444444446 | 移动 置顶 |
嘻嘻 | +86-13444444447 | 移动 置顶 |
二、设计实现
数据库中,增加
order
字段来标识排序,
order_time
辅助排序。
数据库设计:
CREATE TABLE IF NOT EXISTS `app_basic` (
`user_id` VARCHAR(32) NOT NULL COMMENT '用户 Id',
`username` VARCHAR(64) NOT NULL COMMENT '用户名',
`phone_number` VARCHAR(64) NOT NULL COMMENT '手机号',
`order` INT NOT NULL DEFAULT 0 COMMENT '排序字段',
`order_time` DATETIME NOT NULL DEFAULT current_timestamp COMMENT '排序时间',
`create_time` DATETIME NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
`modify_time` DATETIME NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp COMMENT '更新时间',
PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '用户表';
举个栗子:
- 初始情况:
默认排序:
order
(降序
DESC
)、
order_time
(升序
ASC
);
order
均为 0,
order_time
为插入时间
姓名 | 手机号 | order | order_time |
滴滴 | +86-13444444444 | 2020-11-03 9:45:15 | |
啦啦 | +86-13444444445 | 2020-11-04 10:05:09 | |
哈哈 | +86-13444444446 | 2020-11-05 11:25:01 | |
嘻嘻 | +86-13444444447 | 2020-11-06 12:13:40 |
- 情景1,“嘻嘻” 移动到 “哈哈” 之上
“嘻嘻”记录如何变化:
order
字段(
order
+ 1),
order_time
更新为当前时间(2020-11-07 12:00:11)
姓名 | 手机号 | order | order_time |
滴滴 | +86-13444444444 | 2020-11-03 9:45:15 | |
啦啦 | +86-13444444445 | 2020-11-04 10:05:09 | |
嘻嘻 | +86-13444444447 | 1 | 2020-11-07 12:00:11 |
哈哈 | +86-13444444446 | 2020-11-05 11:25:01 |
- 这时候按照
、order
排序有问题。order_time
解决方法:将原先 “哈哈” 之上的记录
order + 1
,但不改变
order_time
展示如下:
姓名 | 手机号 | order | order_time |
滴滴 | +86-13444444444 | 1 | 2020-11-03 9:45:15 |
啦啦 | +86-13444444445 | 1 | 2020-11-04 10:05:09 |
嘻嘻 | +86-13444444447 | 1 | 2020-11-07 12:00:11 |
哈哈 | +86-13444444446 | 2020-11-05 11:25:01 |
三、其他设计
还有一些其他方案:
- 全量排序,保证每个
均不同order
每次修改,前端需全量上传,每个记录的 order
- 如图:
姓名 | 手机号 | order |
滴滴 | +86-13444444444 | 1 |
啦啦 | +86-13444444445 | 2 |
嘻嘻 | +86-13444444447 | 3 |
哈哈 | +86-13444444446 | 4 |
缺点:限制数量。
需限定排序总数,比如 20 个以内能排序。
- 其他方案