Arangodb: Best modelling strategy to reference leaf in a tree like structure -


given fix 3 levels deep tree structure like

collection: tree

{     "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"         }]     }] } 

and in collection reference "leaf" node:

collection "person"

{   "name": {     "first": "john",     "last": "doe"   },   "linktoleaf": "<need reference leaf node. e.g. 'level 1.2.1'>" } 

and need query data to:

  1. render tree admin user can organize hierarchy (basic crud page)
  2. display in place breadcrumb "you in: level 1 > level 1.2 > level 1.2.1"
  3. establish link "leaf node"

using arangodb, what's best way model data? using graph, simple json documents, mix of both, else?

i'm working on new project , want make jump nosql coming background of traditional rdbms model tree using recursive join , therefore , reference "leaf node" using it's primary key.

not sure how arangodb...

there several points should have influence on data model:

  • as in regular databases, joins don't come free. aggregating data several collections 1 document can helpfull.
  • depending on want update working structured documents can become challenging , produce hard read aql.

in example show seems self similar, nested fractal. can shure make flat, , did nested via graph traversals. can benificial code on client side, , not bound fixed number of layers; graph traversals produce nice behaviour , can iterate deeper dynamical.

the new arangodb pattern matching traversals that:

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}) 

recursing structure:

db._query("for v in 1..3 outbound 'names/level1' nameedges return v"      ).toarray() 

connecting persons; show vertices, edges , paths them:

db._query("for v, e, p in 1..4 outbound 'names/level1' " +           "nameedges,nametopersons " +           "return {v:v, e:e, p:p}").toarray() 

you can shure filter on arbitrary attributes of edges, vertices , paths:

db._query("for v, e, p in 1..4 outbound 'names/level1' " +           "nameedges,nametopersons " +           "filter e.alien != true " +           "return {v:v}").toarray() 

Comments

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -