2016-02-08 21 views
0

Arangodb:最佳建模策略引用葉子在樹上等給出一個修復3級深樹結構結構

集合:樹

{ 
    "name": "Level 1", 
    "children": [{ 
     "name": "Level 1.1", 
     "children": [{ 
      "name": "Level 1.1.1" 
     }, { 
      "name": "Level 1.1.2" 
     }] 
    }, { 
     "name": "Level 1.2", 
     "children": [{ 
      "name": "Level 1.2.1" 
     }] 
    }] 
} 

而在另一個集合參考「葉子」節點:

集 「人」

{ 
    "name": { 
    "first": "John", 
    "last": "Doe" 
    }, 
    "linkToLeaf": "<need to reference a leaf node. e.g. 'Level 1.2.1'>" 
} 

,將需要的數據查詢到:

  1. 渲染樹,以便管理員用戶可以組織層次(基本CRUD頁)
  2. 顯示在一些地方的麪包屑「您在:1級>等級1.2>等級1.2.1"
  3. 建立到‘葉節點’

使用arangodb,什麼是數據模型的最佳方式?使用圖表,簡單的JSON文檔,兩者混合,還有其他的東西?

我正在開發一個新項目,我們希望跳轉到NoSQL,但是來自傳統RDBMS的背景我只是使用遞歸連接對樹進行建模,因此只需使用它的「葉節點」首要的關鍵。

不知道該怎麼辦呢Arangodb ...

回答

3

有跡象表明,應該對你的數據模型的影響幾點:

  • 在常規數據庫,連接不免費的。將幾個集合中的數據合併到一個文檔中可能會有幫助。
  • 取決於您想要更新的內容使用深層結構化的文檔可能會變得具有挑戰性並且難以閱讀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()