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:
- render tree admin user can organize hierarchy (basic crud page)
- display in place breadcrumb "you in: level 1 > level 1.2 > level 1.2.1"
- 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
Post a Comment