【发布时间】:2017-07-13 00:24:24
【问题描述】:
在很多情况下,我们需要修改一对多或多对多关联,并且关联作为分页列表暴露给查询。
有一些关键要求:
- 客户端必须能够删除、添加和更新关联元素
- 在某些情况下,关联的顺序很重要,在这种情况下,客户端也必须能够重新排序元素
不太重要:
- 客户端应该能够在创建父项时指定关联(例如,在创建产品的同时创建一组有序的变体)
- 客户端应该能够通过某种形式的事务原子性一次性删除、添加、更新和重新排序关联元素
- 客户端不必为了添加或删除单个元素而对整个当前关联进行分页
这个问题有很多可能的解决方案:
选项 1 - 单个输入字段,无其他突变
输入类型有一个数组输入字段,表示关联的全部真实性(添加新元素,更新现有元素,删除缺失元素,并在必要时保留顺序)。
缺点:删除非常隐含。客户端必须对关联的整个当前状态进行分页。不是颗粒状的。
选项 2 - 带位置的单个输入字段,删除突变
输入类型有一个数组输入字段,用于更新现有元素和添加新元素(忽略缺失的元素)。可以在元素上指定位置或索引值以重新排序它们。单独的突变用于删除元素。
缺点:当所有其他操作都在父级上时,删除在突变中自行关闭是不一致的。不是很细。
选项 3 - 单个输入字段,删除和重新排序突变
输入类型有一个数组输入字段,用于更新现有元素和添加新元素(忽略缺失的元素)。单独的突变用于删除和重新排序元素。
缺点:客户无法将新元素添加到关联中的特定位置,它们必须单独添加然后重新排序。不是很细。
选项 4 - 单个输入字段,添加/删除/重新排序突变
与选项 3 一样,只是输入字段仅用于更新;单独的突变用于添加新元素。
缺点:客户端必须进行多次更改才能执行复杂的更新。客户端无法创建具有初始关联的父级。
选项 5 - 完全独立的突变
父输入类型没有相关字段,一切都是通过四个独立的添加/删除/更新/重新排序突变完成的。
优点:非常明确和细化,将不同的数据模型对象分开。 缺点:客户端必须进行多次更改才能执行复杂的更新。客户端无法创建具有初始关联的父级。
选项 6 - 两个带位置的输入字段
输入类型有两个数组字段:一个用于更新、添加和重新排序元素(请参阅选项 2),另一个用于删除。
缺点:感觉就像我们正在污染父突变;不是颗粒状的。
选项 7 - 两个输入字段,重新排序突变
与选项 6 类似,不同之处在于使用单独的重新排序突变而不是位置参数。
缺点:重新排序无法自行关闭。另请参阅选项 6 的缺点。
所有这些选项似乎都有缺点。选项 5 似乎是最明确的,但要求用户同时使用多个突变,其中操作不再是真正的原子。
Facebook 处理这些类型的突变的方式是什么?你的方法是什么?谢谢!
【问题讨论】: