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 sufďŹciency
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 sufďŹciency
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 sufďŹciency
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 sufďŹciency
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 sufďŹciency
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