7. % whoami
# curl http://susanpotter.net/whoami/windycitydb2011.json
• 15 years RDBMS
• 3-4 years KV databases (CouchDB and now Riak)
• 1 year Redis
• Using graph database in next part of platform
8. % whoami
# curl http://susanpotter.net/whoami/windycitydb2011.json
• 15 years RDBMS
• 3-4 years KV databases (CouchDB and now Riak)
• 1 year Redis
• Using graph database in next part of platform
9. % whoami
# curl http://susanpotter.net/whoami/windycitydb2011.json
• 15 years RDBMS
• 3-4 years KV databases (CouchDB and now Riak)
• 1 year Redis
• Using graph database in next part of platform
10. % whoami
# curl http://susanpotter.net/whoami/windycitydb2011.json
• 15 years RDBMS
• 3-4 years KV databases (CouchDB and now Riak)
• 1 year Redis
• Using graph database in next part of platform
11. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
12. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
13. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
14. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
15. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
16. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
17. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
18. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
19. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
20. Scope of Talk
• Problem Domain • not Consistent Hashing or DHTs
• Linking Objects • not Vector Clocks
• Traversing Links • not Gossip Protocol
• Link Maintainence • not Hinted Handoff
• not Read Repair
• not Eventual Consistency
28. Linking[2/2]
• Two Dimensional
both direction and type/tag
• 0..* links per object
of any type/tag
• Metadata traversing
not load, parse, then lookup cycle
• Model sufficiency
otherwise graph database might be more useful
• Link to other buckets
(in same Riak cluster)
29. Linking[2/2]
• Two Dimensional
both direction and type/tag
• 0..* links per object
of any type/tag
• Metadata traversing
not load, parse, then lookup cycle
• Model sufficiency
otherwise graph database might be more useful
• Link to other buckets
(in same Riak cluster)
30. Linking[2/2]
• Two Dimensional
both direction and type/tag
• 0..* links per object
of any type/tag
• Metadata traversing
not load, parse, then lookup cycle
• Model sufficiency
otherwise graph database might be more useful
• Link to other buckets
(in same Riak cluster)
31. Linking[2/2]
• Two Dimensional
both direction and type/tag
• 0..* links per object
of any type/tag
• Metadata traversing
not load, parse, then lookup cycle
• Model sufficiency
otherwise graph database might be more useful
• Link to other buckets
(in same Riak cluster)
32. Linking[2/2]
• Two Dimensional
both direction and type/tag
• 0..* links per object
of any type/tag
• Metadata traversing
not load, parse, then lookup cycle
• Model sufficiency
otherwise graph database might be more useful
• Link to other buckets
(in same Riak cluster)
33. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
• GET /riak/album/Born-This-Way/artist,performer,1
• GET /riak/album/Born-This-Way/artist,producer,1
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
34. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
• GET /riak/album/Born-This-Way/artist,producer,1
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
35. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
• GET /riak/album/Born-This-Way/artist,producer,1
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
36. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
37. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
38. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
=> artists linked to album with tag/type “producer”
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
39. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
=> artists linked to album with tag/type “producer”
• GET /riak/album/Born-This-Way/_,performer,1
• GET /riak/album/Born-This-Way/_,producer,1
40. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
=> artists linked to album with tag/type “producer”
• GET /riak/album/Born-This-Way/_,performer,1
=> object linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/_,producer,1
41. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
=> artists linked to album with tag/type “producer”
• GET /riak/album/Born-This-Way/_,performer,1
=> object linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/_,producer,1
42. Traversing Links[1/4]
• GET /riak/album/Born-This-Way/artist,_,1
=> all artists linked to album regardless of link tag/type
• GET /riak/album/Born-This-Way/artist,performer,1
=> artists linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/artist,producer,1
=> artists linked to album with tag/type “producer”
• GET /riak/album/Born-This-Way/_,performer,1
=> object linked to album with tag/type “performer”
• GET /riak/album/Born-This-Way/_,producer,1
=> object linked to album with tag/type “producer”
43. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
• GET /riak/album/A/artist,producer,0/album,release,1
44. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
• GET /riak/album/A/artist,producer,0/album,release,1
45. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
• GET /riak/album/A/artist,producer,0/album,release,1
46. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
• GET /riak/album/A/artist,producer,0/album,release,1
47. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
• GET /riak/album/A/artist,producer,0/album,release,1
48. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
=> all “collaborators” of “performers” on album A excluding “performers”
• GET /riak/album/A/artist,producer,0/album,release,1
49. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
=> all “collaborators” of “performers” on album A excluding “performers”
• GET /riak/album/A/artist,producer,0/album,release,1
50. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
=> all “collaborators” of “performers” on album A excluding “performers”
• GET /riak/album/A/artist,producer,0/album,release,1
51. Traversing Links[2/4]
• GET /riak/album/A/artist,_,1/artist,collaborator,1
=> all artists associated with album A and all artists that have collaborated with these artists
• GET /riak/album/A/artist,performer,0/artist,collaborator,1
=> all “collaborators” of “performers” on album A excluding “performers”
• GET /riak/album/A/artist,producer,0/album,release,1
=> all albums that “producers” on album A have released
52. Traversing Links[3/4]
artist,performer,1
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
53. Traversing Links[3/4]
artist,performer,1
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
54. Traversing Links[3/4]
artist,performer,1
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
55. Traversing Links[3/4]
artist,performer,1
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
56. Traversing Links[3/4]
_,_,0
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
57. Traversing Links[3/4]
_,_,0/album,release,1
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
58. Traversing Links[3/4]
• Bucket name
e.g. artist, album
• Tag (or type) name
e.g. performer, producer
• Return (or “keep”)
useful in nested traversals
• Wildcarding
’_’ for bucket and tag means “any”
• Nesting
traverse on multiple levels
• Multiple Sources?
how to walk links from multiple objects?
62. Link Maintenance
• Commit Hooks
can use either pre- or post-commit hooks
• Automatic Backlinks
can use commit hooks to generate backlinks automatically
• Trigger Messages
links could only be used as triggers
• Delete Cleanup
post-commit hook with backlinks can clean up links to new orphans automatically
63. Link Maintenance
• Commit Hooks
can use either pre- or post-commit hooks
• Automatic Backlinks
can use commit hooks to generate backlinks automatically
• Trigger Messages
links could only be used as triggers
• Delete Cleanup
post-commit hook with backlinks can clean up links to new orphans automatically
64. Link Maintenance
• Commit Hooks
can use either pre- or post-commit hooks
• Automatic Backlinks
can use commit hooks to generate backlinks automatically
• Trigger Messages
links could only be used as triggers
• Delete Cleanup
post-commit hook with backlinks can clean up links to new orphans automatically
65. Link Maintenance
• Commit Hooks
can use either pre- or post-commit hooks
• Automatic Backlinks
can use commit hooks to generate backlinks automatically
• Trigger Messages
links could only be used as triggers
• Delete Cleanup
post-commit hook with backlinks can clean up links to new orphans automatically