后端大佬请进!帮我看看这个排序方法可以行得通吗?

2022-03-18 16:41:54 +08:00
 userKamtao

兄弟萌!我这个排序方法可以行得通吗?

最近接到一个需求,技术栈 go+mysql 要给做个列表排序,一开始觉得很简单,直接加个排序号字段就 ORDER BY 好了 但是做一半我才发现,如果 100W 条数据 如果最后一条记录要排到第一位 排序号岂不是要整体记录都更新一次。

于是想了这个方案。 如图

5563 次点击
所在节点    程序员
58 条回复
xylophone21
2022-03-19 10:00:41 +08:00
@GeruzoniAnsasu
其实还是需求没说清楚,原贴的需求是插入,34 楼你增加了要按 index/顺序取数据的需求。所以我们要原谅产品经理老改需求:)

但问题是 op 原贴的浮点数方案也不能按 index 取数据,你要第三个,排序号是 3 的,前面可能有 1.1, 1.11,1.111.....n 个,哪怕范围也不一定可靠,除非你的数据有其它特征,比如每天插入的数量有限,大概率均匀分布等。然后再利用每天晚上重新索引等办法解决。 所以多想一步,只能假设没有这个需求。
wangritian
2022-03-19 10:04:59 +08:00
使用过类似楼主的方案,仍然保持整数,让运营设置的时候序号间隔为 10 ,如 10 20 30 ... -10 -20 -30 ... 方便后期插入
rrfeng
2022-03-19 10:10:56 +08:00
现实中不可能有这种产品设计的。
真要做的话 score 预留间隔,移动的时候先计算有没有间隔有的话就直接更新,没有就移动周围临近的数据腾出空间。

为了保证空间足够可以用文本编码来做 score ,留个一万间隔怎么也够用了
kosmosr
2022-03-19 10:20:13 +08:00
你的业务会取出 100w 条数据来?
lililqth
2022-03-19 10:31:01 +08:00
没问题,这就类似于分布式系统中的 hybrid clock
CokeMine
2022-03-19 10:41:27 +08:00
gjquoiai
2022-03-19 11:31:03 +08:00
@documentzhangx66 你完全没懂 @GeruzoniAnsasu 在说什么,甚至也没搞明白前提。前提是这坨数据已经在数据库里了,跟数据库用什么数据结构存一点关系也没有。你的做法是在数据库上实现链表,他的做法是在上面实现 B 树。所以就很清楚了,就是找个合适的数据结构在数据库上用表实现,你再想想链表合适吗?
ganbuliao
2022-03-19 15:07:01 +08:00
直接换位不好吗
documentzhangx66
2022-03-19 16:20:19 +08:00
@gjquoiai

我在前面已经说过了,希望你回复之前,能认真看看我的评论,我想表达的意思是:

1.楼主在问题里的描述,有歧义。39 楼的第 3 点。

2.你说的这种情况,我已经回答了,36 楼。
gjquoiai
2022-03-19 18:05:13 +08:00
@documentzhangx66 #49 OP 要解决的问题是很清楚的,只是提出一种设计方案不知道好不好。那么请问您的方案就是在数据库里存链表吗?
wa007
2022-03-19 18:44:10 +08:00
盲猜有序链表
documentzhangx66
2022-03-19 21:51:25 +08:00
@gjquoiai

1.我不觉得楼主已经说清楚事情了,当然也许是我的理解能力有问题。不过既然有别人也提出这个疑问了,我觉得有必要请楼主仔细说说最原始的需求,以及楼主具体的设计与实现方案。

2.我在之前与别人的评论里,提出的方案是,如果楼主的设计没有乱来,那么楼主不需要关心这个事情,直接操作就行。但如果楼主在设计上出错,那么大家有必要了解楼主的原始需求是什么,因为有可能这是个 X-Y 问题。
mmdsun
2022-03-19 22:27:10 +08:00
像微信表情那样排序,只给一个置顶操作。不要给自由拖动排序。或者给个上 /下按钮,update 加 /减数据 sort_num 字段即可。
ch2
2022-03-19 23:43:57 +08:00
100W 大列表排序,前端是怎么展示的?
twing37
2022-03-20 00:01:58 +08:00
@ch2 前端 lazylist render + sub bucket subscribe update 我现在就在做这件事

@GeruzoniAnsasu 我觉得这位兄弟的概括重新发明了 b 树这段话是明白人

op 应该把场景提出来. 比如: 榜单的实时排序 或者是 在线成员列表 这种场景下的解决方案而不是倒推

就好像大家疑惑的.那 100w 索引挪到位置 1 .这什么骚操作
jie123168
2022-03-20 11:59:34 +08:00
我觉得楼主整体思路是没问题的:
加一个排序字段 priority. 修改该字段值来排序. 但是字段用浮点数不太合适.
priority 最好用 int 或者 bigint.
而且 priority 不能连续生成.最好是有间隔比如默认是间隔 1000 或者 10000, 这样中间插入就方便了.
当相邻大小的两个 priority 数值差小于 2(中间不能再插入了)时. 要对附近的一批数据修改, 确保中间还能再插入. (这步操作可以异步的完成)
ClorisYe
2022-03-20 20:49:45 +08:00
想想这么大量的数据,有没有任意排的必要先。
agostop
2022-03-20 22:32:40 +08:00
我觉得应该召唤一下 OP ,问问到底有没有分页展示的需求

按理说,@documentzhangx66 说用链表,是没问题,关键是不知道是否输出的时候需要分页展示?
@GeruzoniAnsasu 意思就是如果你用链表,如果需要分页的情况下,就比较难办

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841306

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX