nosql: death to relational databases(?)
DESCRIPTION
Overview of the NoSQL ecosystem given at RubyConf 2009TRANSCRIPT
bensco'ield – viget labsrubyconf20 november 2009
NoSQLDeath to Relational Databases(?)
Friday, November 20, 2009
Motivations
Friday, November 20, 2009
Performance
Friday, November 20, 2009
Friday, November 20, 2009
Scalability
Friday, November 20, 2009
Friday, November 20, 2009
Friday, November 20, 2009
Flexibility
Friday, November 20, 2009
Friday, November 20, 2009
Locus of Work
Friday, November 20, 2009
Charlie Chaplin
Jet Li
Marian Collier
Hank Mann
Friday, November 20, 2009
Domain Complexity
Friday, November 20, 2009
Friday, November 20, 2009
Taxonomy
Friday, November 20, 2009
Key-‐Value Stores
Friday, November 20, 2009
distributed hash tables
Friday, November 20, 2009
DynamoGT.MPStoreRedis
Friday, November 20, 2009
Column-‐Oriented Stores
Friday, November 20, 2009
semi-‐structured
Friday, November 20, 2009
BigTableCassandraHBase
Friday, November 20, 2009
Document-‐Oriented Stores
Friday, November 20, 2009
also semi-‐structured
Friday, November 20, 2009
CouchDBMongoDBRDDBRiak
Friday, November 20, 2009
Graph Databases
Friday, November 20, 2009
graph theory
Friday, November 20, 2009
ActiveRDF AllegroGraphNeo4J
Friday, November 20, 2009
Comparisons
Friday, November 20, 2009
Performance
Friday, November 20, 2009
key-‐value storescolumn-‐oriented storesdocument-‐oriented storesrelational databasesgraph databases
Friday, November 20, 2009
Scalability
Friday, November 20, 2009
key-‐value storescolumn-‐oriented storesdocument-‐oriented storesrelational databasesgraph databases
Friday, November 20, 2009
Flexibility
Friday, November 20, 2009
key-‐value storesdocument-‐oriented storesgraph databases column-‐oriented storesrelational databases
Friday, November 20, 2009
Locus of Work
Friday, November 20, 2009
key-‐value storescolumn-‐oriented storesdocument-‐oriented storesrelational databasesgraph databases
Friday, November 20, 2009
Domain Complexity
Friday, November 20, 2009
key-‐value storescolumn-‐oriented storesdocument-‐oriented storesrelational databasesgraph databases
Friday, November 20, 2009
Examples
Friday, November 20, 2009
Redis
Friday, November 20, 2009
Data Typesstringslistssets
Friday, November 20, 2009
In-‐Memoryperiodic snapshotsmaster-‐slave replicationmemory-‐bound
Friday, November 20, 2009
require 'redis'
gl = Redis.new
# A stringgl['name'] = 'Kyle Rayner'gl['name']gl.delete('name')
# A listgl.push_tail 'to-dos', 'Lose Ion power'gl.push_tail 'to-dos', 'Mourn dead loved ones'gl.push_tail 'to-dos', 'Blow up zombie lanterns'
gl.list_range('to-dos', 0, -1)
Friday, November 20, 2009
Tokyo Cabinet
Friday, November 20, 2009
Data Typesstringstables!
Friday, November 20, 2009
Related Projectstyrantdystopiapromenade
Friday, November 20, 2009
require 'rufus/tokyo'
# Key-valueleagues = Rufus::Tokyo::Cabinet.new('jl.tch')leagues['JLI'] = [ 'Batman', 'Black Canary', 'Blue Beetle', 'Captain Marvel', 'Doctor Light', 'Doctor Fate', 'Guy Gardner','Martian Manhunter', 'Mister Miracle'].to_yaml
YAML.load(leagues['JLI'])
Friday, November 20, 2009
require 'rufus/tokyo'
# Tablebig7 = Rufus::Tokyo::Table.new('big7.tct')
big7['s'] = {'name' => 'Superman', 'role' => 'deus ex machina'}big7['b'] = {'name' => 'Batman', 'role' => 'mastermind'}big7['gl'] = {'name' => 'Green Lantern', 'role' => 'space cop'}big7['f'] = {'name' => 'Flash', 'role' => 'speedster'}big7['mm'] = {'name' => 'Martian Manhunter', 'role' => '?'}big7['ww'] = {'name' => 'Wonder Woman', 'role' => 'hitter'}big7['a'] = {'name' => 'Aquaman', 'role' => 'fish-talking'}
big7.query {|q| q.add_condition 'role', :streq, 'fish-talking'}
Friday, November 20, 2009
Cassandra
Friday, November 20, 2009
GenealogyDynamoBigTable
Friday, November 20, 2009
Column-‐Orientedcolumnssupercolumnscolumn families
Friday, November 20, 2009
Distributedautomatic replicationeventual consistencyeasy expansion
Friday, November 20, 2009
Availabilityweak readsquorum reads
Friday, November 20, 2009
require 'cassandra'
op = Cassandra.new('OnePiece')
op.insert(:People, '1', {'name' => 'Luffy'})op.insert(:People, '2', {'name' => 'Crocodile'})op.insert(:People, '3', {'name' => 'Mr. 3'})
op.insert(:Fights, '1', {'opponents' => {UUID.new => '2'}})op.insert(:Fights, '1', {'opponents' => {UUID.new => '3'}})
luffy_fights = op.get(:Fights, '1', 'opponents')luffy_fights.map {|t, opp| op.get(:People, opp, 'name')}
Friday, November 20, 2009
CouchDB
Friday, November 20, 2009
Web-‐InspiredJSON storageHTTP / RESTful interface
Friday, November 20, 2009
ViewspredeVined, updated incrementallyjavascript for map/reduce
Friday, November 20, 2009
Updatesfull, including embedded documents
Friday, November 20, 2009
require 'couchrest'
konoha = CouchRest.database!('http://127.0.0.1:5984/konoha')naruto = konoha.save_doc { 'name' => 'Naruto Uzumaki', 'chakra' => 'wind'}shikamaru = konoha.save_doc { 'name' => 'Shikamaru Nara', 'chunin' => true}
konoha.save_doc { '_id' => '_design/first', :views => { :chunin => { :map => 'function(doc){if(doc.chunin){emit(null, doc);}}' } }}
puts konoha.views('first/chunin')['rows'].inspect
Friday, November 20, 2009
MongoDB
Friday, November 20, 2009
Storagebinary JSON documents
Friday, November 20, 2009
Accessnative clients
Friday, November 20, 2009
Queriesdynamicindex-‐based
Friday, November 20, 2009
Updatesallows partial updates
Friday, November 20, 2009
require 'mongo'
avengers = Mongo::Connection.new.db('avengers')members = avengers.collection('members')
members.insert {'name' => 'Ant-Man'}members.insert {'name' => 'Hulk'}members.insert {'name' => 'Iron Man'}members.insert {'name' => 'Thor'}members.insert {'name' => 'Wasp'}
members.create_index('name')
pym = members.find {'name' => 'Ant-Man'}pym['name'] = 'Giant-Man'pym.save
members.remove {'name' => 'Hulk'}
members.insert {'name' => 'Captain America'}
Friday, November 20, 2009
Neo4J
Friday, November 20, 2009
Structurenodes and edgeskey-‐value pairs
Friday, November 20, 2009
Querieslucene
Friday, November 20, 2009
require 'neo4j'
class Person include Neo4j::NodeMixin property :name, :mutant index :name, :mutant has_n :interests has_n :dates has_n :marriages def initialize(name, mutant = true) name = name mutant = mutant endend
Friday, November 20, 2009
Neo4j::Transaction.run do magneto = Person.new('Magneto') esme = Person.new('Esme') rogue = Person.new('Rogue') magda = Person.new('Magda', false) wasp = Person.new('Wasp', false) magneto.interests << wasp magneto.marriages << magda magneto.dates << rogue esme.interests << magneto magda.marriages << magneto rogue.dates << magnetoend
Friday, November 20, 2009
magneto = Person.find(:name => 'Magneto')
# Who likes Magneto?magneto.relationships.incoming(:interests).nodes
# Which non-mutants has Magneto dated?magneto.dates{ !mutant? }.to_a
Friday, November 20, 2009
Simulations
Friday, November 20, 2009
Structure
Friday, November 20, 2009
people{ ‘name’:‘Jimmy Olsen’ ‘title’:‘Superman’s Pal’ ‘company_id’:12441}
companies{ _id:12441 ‘name’:‘Daily Planet’}
Friday, November 20, 2009
Lack of Structure
Friday, November 20, 2009
mysql> SELECT * FROM people LIMIT 1 \G*************************** 1. row *************************** id: 1content: --- company: Daily Planetname: Jimmy Olsentitle: Superman’s Pal
Friday, November 20, 2009
mysql> desc people;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || name | varchar(50) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+
mysql> desc attributes;+-----------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------+--------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || person_id | int(11) | YES | | NULL | || attribute | varchar(50) | YES | | NULL | || value | varchar(100) | YES | | NULL | |+-----------+--------------+------+-----+---------+-------+
Friday, November 20, 2009
Not Only SQL
Friday, November 20, 2009
Caching
Friday, November 20, 2009
Already in Usememcached
Friday, November 20, 2009
Logging
Friday, November 20, 2009
Rails Log Replacementhttp://github.com/peburrows/mongo_db_logger
Friday, November 20, 2009
Hybrid Domains
Friday, November 20, 2009
different domains
Friday, November 20, 2009
Publishinge-‐commercedocuments
Friday, November 20, 2009
Datinge-‐commercesocial graph
Friday, November 20, 2009
different scales
Friday, November 20, 2009
Photo Sharinguser accountsuploaded photos
Friday, November 20, 2009
Next Steps
Friday, November 20, 2009
Explore
Friday, November 20, 2009
Database Listhttp://internetmindmap.com/database_software
NoSQL Google Grouphttp://groups.google.com/group/nosql-‐discussion
NoSQL Ecosystemhttp://www.rackspacecloud.com/blog/2009/11/09/nosql-‐ecosystem/
Wave!
Friday, November 20, 2009
Ignore the Database
Friday, November 20, 2009
Logical Modeling Firstbe mindful
Friday, November 20, 2009
Change the Default
Friday, November 20, 2009
Application Templatesstart with something new
Friday, November 20, 2009
@bsco'ieldben.sco'[email protected]://spkr8.com/bscoVieldhttp://viget.com/extendhttp: //benscoVield.com
bensco'ield
Friday, November 20, 2009