文章目錄
- 一、需求
- 二、設計實作
- 三、其他設計
一、需求
需求:可以自定義排序
- 可以将一個記錄移動到另一記錄的上方或下方
- 可以置頂
原型,如下:
姓名 | 手機号 | 操作(排序) |
滴滴 | +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 個以内能排序。
- 其他方案