在很多情况下,我们有突变,其中有一个一对多或多对多的关联,我们需要变异,而关联作为一个分页列表暴露在查询中。
有几个关键需求:
不太重要:
对于这个问题,有许多可能的解决方案:
选项1-单输入字段,没有额外的突变
输入类型有一个数组输入字段,表示关联的全部真实性(添加新元素,更新现有元素,删除缺失元素,并在必要时保留顺序)。
缺点:删除非常含蓄。客户端必须对关联的整个当前状态进行分页。不是粒状的。
选项2-带有位置的单输入字段,删除突变
输入类型只有一个数组输入字段,用于更新现有元素并添加新元素(忽略缺少的元素)。可以在元素上指定位置或索引值以重新排序。一个单独的突变被用来删除元素。
缺点:删除是不一致的,当所有其他操作都在父操作上时,在一个突变中单独关闭它。不是很粒状。
选项3-单输入字段,删除和重新排序突变
输入类型只有一个数组输入字段,用于更新现有元素并添加新元素(忽略缺少的元素)。单独的突变被用来删除和重新排序元素。
缺点:客户端不能向关联中的特定位置添加新元素,必须添加它们,然后单独重新排序。不是很粒状。
选项4-单输入字段,添加/删除/重新排序突变
与选项3一样,除了输入字段之外,输入字段仅用于更新;另一个突变用于添加新元素。
缺点:客户端必须进行多个突变才能执行复杂的更新。客户端不能创建具有初始关联的父级。
选项5-完全独立的突变
父输入类型没有相关的字段,所有操作都是通过添加/删除/更新/重新排序的四个单独的突变来完成的。
优点:非常明确和细粒度,保持不同的数据模型对象分开。缺点:客户端必须进行多个突变才能执行复杂的更新。客户端不能创建具有初始关联的父级。
选项6-两个有位置的输入字段
输入类型有两个数组字段:一个用于更新、添加和重新排序元素(参见选项2),另一个用于删除。
缺点:感觉我们在污染父母的突变,而不是颗粒。
选项7-两个输入字段,重新排序突变
就像选项6一样,除了一个单独的重序变异被使用,而不是位置参数。
缺点:不一致的重新排序,以关闭自己。也见备选方案6的缺点。
所有这些选择似乎都有缺点。选项5似乎是最明确的,但要求用户同时使用多个突变,那里的操作不再是真正的原子操作。
Facebook处理这些突变的方法是什么?你的方式是什么?谢谢!
发布于 2017-02-22 19:53:37
在所有这些方法之间肯定存在权衡,所以选择一种确实取决于我试图构建的是什么。
Facebook模式中最常见的情况有两个很好的限制:
Facebook上的评论就是这里的典型例子。对于这种情况,我们已经非常成功地使用了选项5,我可以自信地推荐它。对于注释,我们只会有三个突变:commentCreate、commentEdit和commentDelete。
对于这种情况,我们最终得到了共同的模式:
create和edit (或update)突变,突变解析为的对象通常包含已修改的 edge (在分页最佳实践医生中使用edge的含义与在分页最佳实践医生中使用edge相同)。从这个边缘,你可以得到修改过的物体.但是,您也可以获得任何可能需要的边缘数据。delete突变通常只返回已删除对象的ID;如果客户端在输入中提供了该ID,则这对客户端来说是一个纯粹的方便,但是如果删除输入接受其他信息,并且服务器将其转换为ID,则会非常有用,在这种情况下,返回已删除的ID可以让客户端知道哪个对象被删除。备选方案5.客户端不能创建具有初始关联的父级。
我不太确定我是否遵循了这一点;在我的评论示例中没有一个很好的例子(因为它不存在于产品中),但假设我想同时发布评论并回复该评论,我可以想象这样做:
commentCreate(input: {text:"Hello World", replies:[{text:"Reply 1"}, {text:"Reply 2"}]})
在这里,我重用commentCreate作为replies接受的复数输入类型所使用的输入类型。
对于需要重新排序或批量操作的情况,这似乎是您正在研究的主要情况,我没有那么好的答案,而且这肯定是一个更棘手的案例。我认为我还没有看到足够的例子来自信地推荐一个选项而不是另一个选项,我认为哪种选择最好可能最终取决于特定的用例。不过,另一个需要考虑的选择是,在输入是操作列表的情况下,有一个单独的突变。因此,如果我们有一张“最喜欢的照片”的列表,并且我们想要进行批量更新,我们可以这样做:
favoritePhotosUpdate({operations: {operation:ADD, addedId:1234}, {operation:REMOVE, addedId:5678}, {operation:UPDATE, oldId:4321, newId:8765}, {operation:SWAP, oldId:32, newId:76}
不确定这是否真的比上面的选项更好,但这是我们在过去讨论过的另一个选项(虽然我不确定我们是否已经将它付诸实施),所以它至少值得添加到列表中。
希望这能有所帮助!
https://stackoverflow.com/questions/42400207
复制相似问题