使用 FeathersJS 建立 Deep-Nested Parent-Child 关系

Doing Deep-Nested Parent-Child Relationships using FeathersJS

我想知道建立深层嵌套 parent child 关系的最佳方法是使用 Feathers 的 recommended Association Method?

如果我的条目是:

[
    {"name": "Grandpa", "id": 1, "parent": null},
    {"name": "Mom", "id":2, "parent": 1},
    {"name": "Baby", "id": 3, "parent": 2}
]

然后如果我想找到树的顶部 parent,我将执行递归获取直到到达树的顶部:

const family = app.service('/family')
function get_ancestors(childId, parents){
    const child = family.get(childId)
    if(child.parent){
        parents.push(child.parent)
        return get_ancestors(child.parent, parents)
    } else {
        return parents
    }
}

但这对我来说似乎很笨拙而且不太可扩展。有没有更好的办法? 这好像是fastJoin would do, but it is not under the "Recommended" approach to doing associations. I also don't see any examples of more than 3 levels in the guide, except in maybe the batch-loaders, 这看起来比我们在这里需要的要复杂一些。使用 Feathers 遍历祖先树的 "recommended" 方法是什么? 反过来说,如果我有爷爷,我怎么找宝贝? 我的条目是否应该包含一个 "children" 数组,当 child 与它们一起作为 parent 添加时填充?或者是否有更好的方法从 parent 树的顶部到底部?

归根结底,Feathers 不是 ORM,因此处理关联在很大程度上取决于您选择的数据库和 ORM,这与其他框架的处理方式大同小异比如 Express 或 KoaJS。这意味着更大的灵活性,但也没有真正做到这一点的真正方法,链接的常见问题解答条目试图尽可能好地涵盖不同的选项。

fastJoin 确实支持嵌套关联,但如果您使用 SQL 数据库,ORM 可以处理优化查询(Sequelize 也支持嵌套包含),则速度可能会变慢。但它可以比 Mongoose $populate 更快。 运行 一些实验,看看哪个效果最好。对于 parent/child 关系,需要注意的一件事是循环依赖,因此您想使用可以处理该问题的东西。