V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
StyxS
V2EX  ›  Java

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

  •  
  •   StyxS · 2020-04-17 14:29:50 +08:00 · 2220 次点击
    这是一个创建于 1675 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个文章列表,支持移动某个文章在文章列表里面的顺序
    我的想法是给文章加一个 order 字段,让他插入时自增,检索时按照 order 降序排列
    移动顺序时,就去找目标位置去更改这个 order 字段
    感觉这样问题会比较多 IDENTITTY @generatedValue 后续更改是否会出问题呢?
    像这种场景,最好的设计应该是怎样的
    17 条回复    2020-04-17 21:31:20 +08:00
    wysnylc
        1
    wysnylc  
       2020-04-17 14:35:28 +08:00
    加字段没问题
    StyxS
        2
    StyxS  
    OP
       2020-04-17 14:54:56 +08:00
    @wysnylc 移动顺序的话相当于要重新改多条记录的 order,有更好的方法嘛
    jjianwen68
        3
    jjianwen68  
       2020-04-17 14:58:58 +08:00
    单加一个字段表示排序,不太够吧,置顶,按标签筛选后的排序呢
    StyxS
        4
    StyxS  
    OP
       2020-04-17 15:12:35 +08:00
    @jjianwen68 置顶是独立于排序的这个顺序的,单独弄了个置顶表
    如果按标签筛选排序,用 order 没什么毛病:按标签筛了以后再按 order 排
    这样一想的话,好像限制只能上移下移顺序,就不用处理 order 更改麻烦的问题
    KentY
        5
    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
        6
    StyxS  
    OP
       2020-04-17 17:10:03 +08:00
    @KentY 是的,所以我想请教一下正确的这种“展示顺序”应该用什么样的方式来实现
    KentY
        7
    KentY  
       2020-04-17 17:53:54 +08:00   ❤️ 1
    @StyxS 可以设置两个字段, 一个你说的 order, 另一个也是数字, 默认一个相同的就可以,处理当 order 值一样的情况下, 仅对相同 order 的记录进行重排.
    这样有效限制了 update 的记录数. 如果主表特别大, 根据你用的数据库不同, 可以考虑是不是单独出来一个表会在性能以及 lock 上有帮助. 类似:
    order| sub-order
    1,0
    2,0
    3,0
    3,1
    3,2
    StyxS
        8
    StyxS  
    OP
       2020-04-17 18:08:02 +08:00
    @KentY 感谢
    snowydec
        9
    snowydec  
       2020-04-17 18:14:40 +08:00
    @OrderColumn 注解?
    StyxS
        10
    StyxS  
    OP
       2020-04-17 18:31:24 +08:00
    @snowydec 看了下,ordercolumn 好像是应用在成员列表上来维持排序的,但是这个地方文章表好像并不能用上这个吧?
    ConradG
        11
    ConradG  
       2020-04-17 18:39:18 +08:00 via iPhone   ❤️ 1
    order 字段用浮点类型,变更顺序只用前一条和后一条的 order 取平均
    KentY
        12
    KentY  
       2020-04-17 19:15:17 +08:00
    @ConradG 这个要看他什么要求, 当一定情况下, 总会超过定义的精度要求
    Allianzcortex
        13
    Allianzcortex  
       2020-04-17 19:45:48 +08:00
    如果是类似 trello 这样可以上下拖动改变 ticket 的优先级功能,它的实现是每个 ticket 维护一个 after_id 字段,拖动后会 put 一个请求更新字段,然后前端显示时会根据整个 id 排序后再展示
    lybcyd
        14
    lybcyd  
       2020-04-17 20:10:30 +08:00
    用链表的思路做可以吗?这样的话移动顺序只需要更改关联字段就可以了
    StyxS
        15
    StyxS  
    OP
       2020-04-17 21:29:59 +08:00
    @ConradG 这个思路很牛逼,学习了
    StyxS
        16
    StyxS  
    OP
       2020-04-17 21:30:51 +08:00
    @Allianzcortex 意思是前端来排序?那分页的话应该怎么办呢
    StyxS
        17
    StyxS  
    OP
       2020-04-17 21:31:20 +08:00
    @lybcyd 链表的话,持久化不太方便吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3728 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 04:17 · PVG 12:17 · LAX 20:17 · JFK 23:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.