在我的ArangoDB中,我正在尝试实现某种继承。我有一个父文件,它定义了它的所有孩子。因此,除了Inheritance-ID之外,这些值都是相同的。
因此,在这种情况下,父文档的值如下:
ID: 1
InhID: 0
Name: Doc_1
它的孩子看起来像这样:
ID: 1
InhID: 1
Name: Doc_1
ID: 1
InhID: 2
Name: Doc_1
当我将名称从Doc_1
更改为父级中的任何其他内容时,其所有子级也将被更改,同样适用于新添加的属性。
当前的方法是为每个属性手动编写AQL-Update查询,逐个更新所有值,将其设置为父ID的值,其中ID相同且InhID大于零。
但是在一个声明中有更有效的方法吗?是否有类似传统数据库中的触发器功能?
假设我们在test1集合中包含数据字段:ParentID,InhID,Name,Potatoe
假设我明白你要做什么,你可以:
一次更新父项和子项,例如:
for t in test1
Filter t.ParentID == 1
update t WITH { Potatoe: "baked" , Name: "Doc_2"} IN test1
首先更新父级,然后更新子级(在其他时候我假设):
步骤1
for t in test1
Filter t.ParentID == 1 AND t.InhID == 0
update t WITH { Potatoe: "baked" , Name: "Doc_2"} IN test1
第2步
let Parent = (for p in test1
Filter p.ParentID == 1 AND p.InhID == 0
return p)
for p1 in Parent
for Children in test1
Filter Children.ParentID == p1.ParentID AND Children.InhID > p1.InhID
update Children WITH {Potatoe: p1.Potatoe, Name: p1.Name} IN test1
在触发器方面,Arango中没有这样的东西。我个人认为这很好,因为触发器往往会造成比它们值得更多的麻烦。我会建立一个具有所需逻辑的中间层,让所有外部程序都通过中间层而不是直接命中集合。您可以在位于DB本身的Arango Foxx层中构建它。 Here是Foxx的文档
最后,您是否考虑过从包含数据和隐式继承关系(基于InhID)到集合的单个表以及使用边缘关系的显式继承关系更改db的结构?根据您的工作情况,它可能(或可能不)有用。