这里最明显的答案是,有一个类表示对象,如果有父对象,则引用父对象。跨树的查询将从树的给定节点开始,并返回该节点的所有父对象。每个节点将只有一个直接父节点。
是否有更好的方法在计算上或从软件设计的角度来做到这一点?
编辑:寻找计算复杂性改进建议或可维护性建议。记忆在这里不是什么大问题。
发布于 2021-12-07 15:28:06
@Thomas是关系型的。不确定我们的团队对存储过程的看法是什么,但是如果有足够的理由使用它们,我确信我可以证明这一点。
在关系数据库中,我将使用公共表表达式
WITH foo AS
(
-- your start node
SELECT *
FROM MyData AS d
WHERE d.id = 123
UNION ALL
-- traversing up
SELECT parent.*
FROM MyData AS parent
JOIN foo AS child
ON parent.id = child.parentId
)
-- selecting the data you want to return from the CTE
SELECT * FROM foo;用JS术语,这里描述了上面的查询所做的工作:
// initial SELECT
var foo = myData.filter(item => item.id === 123);
// UNION ALL + SELECT with JOIN onto `foo`
for (let i = 0; i < foo.length; ++i) {
foo.push(...myData.filter(item => item.id === foo[i].parentId));
}
console.log(foo);只有DB select比JS代码中的Array#filter()要快得多,性能也更好,但基本上它们产生的结果是相同的;(0或更多的)列表匹配
https://stackoverflow.com/questions/70260944
复制相似问题