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

请教一下在一对多关系中怎么记录“多”那一端的顺序并且可以快速修改?

  •  
  •   gulu · 2016-07-04 22:24:32 +08:00 · 682 次点击
    这是一个创建于 2861 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说有一个 Task 表, 每个 Task 有很多个 Step , Step 是有顺序的,并且可以进行修改。
    我现在想的是两种途径:

    1. 每个 Step 加一个 integer 类型的 Column 记录顺序, 但是修改顺序的时候就要对 Task 的每个 Step 都进行修改;
    2. 首先, Task 加一个 integer 类型的 Column(称为 step_index) 来统计该 Task 所创建的 step 总数(只增不减,类似于 id 栏), 每次新建 Step 的时候给其赋予 step_index + 1 的 fake_id ; 然后, Task 再加一个 varchar 类型的 Column , 内容是等宽分割的字符串,按顺序记录着 Step 的 fake_id , 这样的好处是修改顺序的时候不需要频繁的读写, 只需要对这个字符串进行修改就好了,获取 Step 时先把字符串转换成一个个的 fake_id , 再去查询。 但是这样在创建和读取的时候就变慢了。

    我现在倾向的是第二种方法,用四个字符表示一个 Step 的 fake_id , 这样只需要 144 个字符,一个 Task 就能有 150 多万个 Step 。

    想问问大家我这个思路正确吗?总感觉好像把问题弄复杂了,但是又不知道简单点怎么搞。

    第 1 条附言  ·  2016-07-05 01:55:20 +08:00
    想法错了, 4 个字符的话, 144 个字符只能允许同时 36 个 Step
    5 条回复    2016-07-05 12:02:52 +08:00
    SoloCompany
        1
    SoloCompany  
       2016-07-05 00:20:12 +08:00   ❤️ 1
    如果是工作流设计的话,你的所谓「频繁」更改到底有多频繁?还是你自己脑补了很频繁?
    说一个不相关的取舍问题,大家都知道, ArrayList 的插入和删除性能不如 LinkedList ,但事实上这一点性能开销完全可以忽略,以至于在大多数情况下, LinkedList 根本没有存在的必要
    gulu
        2
    gulu  
    OP
       2016-07-05 01:22:49 +08:00
    @SoloCompany 谢谢你,额,其实是自己脑补的很频繁的,因为就是我一个自己做着玩的项目。但是如果改一次顺序需要把 Task 的每个 Step 都读写一遍的话从直觉上觉得不对...
    pubby
        3
    pubby  
       2016-07-05 08:25:54 +08:00 via Android   ❤️ 1
    为了 step 排序,我把所有 step 删除重新 insert 都干过。
    至于性能问题,你想多了
    zhjits
        4
    zhjits  
       2016-07-05 11:51:00 +08:00   ❤️ 1
    参考当年带行号的 BASIC 语言: Step 按 index 排序,每次 append 的时候 index +10 ;要插入的话取前后 index 平均数作为待插入项的 index ,不够了就完整 rebuild 一次。
    gulu
        5
    gulu  
    OP
       2016-07-05 12:02:52 +08:00 via Android
    @pubby 你这也太粗暴了 😂

    @zhjits 嗯这个办法蛮有特色的,让我想起了数据库父子关系中的 Node List 设计
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1706 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 00:22 · PVG 08:22 · LAX 17:22 · JFK 20:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.