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

2016-07-04 22:24:32 +08:00
 gulu

比如说有一个 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 。

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

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

@zhjits 嗯这个办法蛮有特色的,让我想起了数据库父子关系中的 Node List 设计

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

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

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

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

© 2021 V2EX