nosql: death to relational databases(?)

Post on 27-Jan-2015

136 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Overview of the NoSQL ecosystem given at RubyConf 2009

TRANSCRIPT

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'ield@viget.comhttp://spkr8.com/bscoVieldhttp://viget.com/extendhttp:  //benscoVield.com

bensco'ield

Friday, November 20, 2009

top related