JPA 关于 list-item 展示顺序问题

2020-04-17 14:29:50 +08:00
 StyxS
比如一个文章列表,支持移动某个文章在文章列表里面的顺序
我的想法是给文章加一个 order 字段,让他插入时自增,检索时按照 order 降序排列
移动顺序时,就去找目标位置去更改这个 order 字段
感觉这样问题会比较多 IDENTITTY @generatedValue 后续更改是否会出问题呢?
像这种场景,最好的设计应该是怎样的
2266 次点击
所在节点    Java
17 条回复
wysnylc
2020-04-17 14:35:28 +08:00
加字段没问题
StyxS
2020-04-17 14:54:56 +08:00
@wysnylc 移动顺序的话相当于要重新改多条记录的 order,有更好的方法嘛
jjianwen68
2020-04-17 14:58:58 +08:00
单加一个字段表示排序,不太够吧,置顶,按标签筛选后的排序呢
StyxS
2020-04-17 15:12:35 +08:00
@jjianwen68 置顶是独立于排序的这个顺序的,单独弄了个置顶表
如果按标签筛选排序,用 order 没什么毛病:按标签筛了以后再按 order 排
这样一想的话,好像限制只能上移下移顺序,就不用处理 order 更改麻烦的问题
KentY
2020-04-17 16:33:06 +08:00
@StyxS 你如果需要顺序这个信息 persist 在数据库里, 当你修改了这个(比如移动了), 肯定这个文章 entry 会被 update.没问题.

你用 `IDENTITTY @generatedValue` 肯定不行, 因为你要的 order 不是 identity

你说道:"移动顺序时,就去找目标位置去更改这个 order 字段"
如果你用自动增量+1 这种方式, 你考虑过没有, 比如:你的 order column:
1,2,3,4,5 现在你移动 5 到 1 和 2 之间, 你需要 update 多少条记录才变成新的 1,2(原来的 5),3(原来的 2),4(原来的 3),5(原来的 4)
StyxS
2020-04-17 17:10:03 +08:00
@KentY 是的,所以我想请教一下正确的这种“展示顺序”应该用什么样的方式来实现
KentY
2020-04-17 17:53:54 +08:00
@StyxS 可以设置两个字段, 一个你说的 order, 另一个也是数字, 默认一个相同的就可以,处理当 order 值一样的情况下, 仅对相同 order 的记录进行重排.
这样有效限制了 update 的记录数. 如果主表特别大, 根据你用的数据库不同, 可以考虑是不是单独出来一个表会在性能以及 lock 上有帮助. 类似:
order| sub-order
1,0
2,0
3,0
3,1
3,2
StyxS
2020-04-17 18:08:02 +08:00
@KentY 感谢
snowydec
2020-04-17 18:14:40 +08:00
@OrderColumn 注解?
StyxS
2020-04-17 18:31:24 +08:00
@snowydec 看了下,ordercolumn 好像是应用在成员列表上来维持排序的,但是这个地方文章表好像并不能用上这个吧?
ConradG
2020-04-17 18:39:18 +08:00
order 字段用浮点类型,变更顺序只用前一条和后一条的 order 取平均
KentY
2020-04-17 19:15:17 +08:00
@ConradG 这个要看他什么要求, 当一定情况下, 总会超过定义的精度要求
Allianzcortex
2020-04-17 19:45:48 +08:00
如果是类似 trello 这样可以上下拖动改变 ticket 的优先级功能,它的实现是每个 ticket 维护一个 after_id 字段,拖动后会 put 一个请求更新字段,然后前端显示时会根据整个 id 排序后再展示
lybcyd
2020-04-17 20:10:30 +08:00
用链表的思路做可以吗?这样的话移动顺序只需要更改关联字段就可以了
StyxS
2020-04-17 21:29:59 +08:00
@ConradG 这个思路很牛逼,学习了
StyxS
2020-04-17 21:30:51 +08:00
@Allianzcortex 意思是前端来排序?那分页的话应该怎么办呢
StyxS
2020-04-17 21:31:20 +08:00
@lybcyd 链表的话,持久化不太方便吧

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

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

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

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

© 2021 V2EX