有跡象表明,應該對你的數據模型的影響幾點:
- 在常規數據庫,連接不免費的。將幾個集合中的數據合併到一個文檔中可能會有幫助。
- 取決於您想要更新的內容使用深層結構化的文檔可能會變得具有挑戰性並且難以閱讀AQL。
在你的例子中,你展示了一些看似非常相似的東西,像分形一樣嵌套。 你可以讓這個平面,並做你通過圖遍歷嵌套。 這對客戶端的代碼來說可能是人爲的,你不僅會綁定到固定數量的圖層, Graph traversals產生一個非常好的行爲,你甚至可以迭代更深的動態。
新ArangoDB模式匹配遍歷可能看起來像:
db._create("names");
db.names.save({_key: "Level1"});
db.names.save({_key: "Level1.1"});
db.names.save({_key: "Level1.1.1"});
db.names.save({_key: "Level1.1.2"});
db.names.save({_key: "Level1.1.3"});
db.names.save({_key: "Level1.2"});
db.names.save({_key: "Level1.2.1"});
db._createEdgeCollection("nameEdges")
db.nameEdges.save("names/Level1", "names/Level1.1", {layer: 0})
db.nameEdges.save("names/Level1.1", "names/Level1.1.1", {layer: 1})
db.nameEdges.save("names/Level1.1", "names/Level1.1.2", {layer: 1})
db.nameEdges.save("names/Level1.1", "names/Level1.1.3", {layer: 1})
db.nameEdges.save("names/Level1", "names/Level1.2", {layer: 0})
db.nameEdges.save("names/Level1.2", "names/Level1.2.1", {layer: 1})
db._create("persons")
db.persons.save({_key: "adam_ant", details: {cname: "adam", lname: "ant"}})
db.persons.save({_key: "david_bowie", details:
{cname: "david", lname: "bowie"}})
db._createEdgeCollection("nameToPersons")
db.nameToPersons.save("names/Level1", "persons/adam_ant",
{himself: true})
db.nameToPersons.save("names/Level1.2", "persons/david_bowie",
{alien: true})
遞歸的結構:
db._query("FOR v IN 1..3 OUTBOUND 'names/Level1' nameEdges RETURN v"
).toArray()
連接的人;我們展示頂點,邊緣和路徑對他們說:
db._query("FOR v, e, p IN 1..4 OUTBOUND 'names/Level1' " +
"nameEdges,nameToPersons " +
"RETURN {v:v, e:e, p:p}").toArray()
您可以爲的邊緣,頂點和路徑任意屬性舒爾過濾器:
db._query("FOR v, e, p IN 1..4 OUTBOUND 'names/Level1' " +
"nameEdges,nameToPersons " +
"FILTER e.alien != true " +
"RETURN {v:v}").toArray()