nosql を ruby で実践するための n 個の方法
TRANSCRIPT
![Page 1: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/1.jpg)
NoSQL を Ruby で実践するための n 個の方法
![Page 2: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/2.jpg)
NoSQL を Ruby で実践するための 1 個の方法
n = 1 である異論は認めにゃいにゃ
![Page 3: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/3.jpg)
西村 友裕 (@Sixeight)にしむら ともひろ
![Page 4: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/4.jpg)
もくじ
• NoSQL とは
• MongoDB について
• MongoMapper を使う
• まとめ
![Page 5: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/5.jpg)
もくじ
• NoSQL とは
• MongoDB について
• MongoMapper を使う
• まとめ
![Page 6: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/6.jpg)
NoSQL
![Page 7: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/7.jpg)
「SQL 止めようぜ」
![Page 8: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/8.jpg)
「SQL 止めようぜ」×
![Page 9: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/9.jpg)
Not only SQL
![Page 10: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/10.jpg)
リレーショナルでないデータベースの
発展促進運動のこと
![Page 11: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/11.jpg)
リレーショナルでない?
![Page 12: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/12.jpg)
スキーマに縛られない
![Page 13: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/13.jpg)
CREATE TABLE cats ( id int NOT NULL, name text, PRIMARY KEY (id));INSERT INTO cats VALUES (1, “tama”);
![Page 14: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/14.jpg)
CREATE TABLE cats ( id int NOT NULL, name text, PRIMARY KEY (id));INSERT INTO cats VALUES (1, “tama”);
斑の色も入れたいにゃー
![Page 15: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/15.jpg)
$ mongo> db.cats.insert({name: “tama”})
ここまでは一緒にゃ
![Page 16: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/16.jpg)
$ mongo> db.cats.insert({name: “tama”})> db.cats.insert({ name: “goro”, dapple_color: “gray” })> db.cats.find(){ "_id" : ObjectId("4c49118783d1600c126d2147"), "name" : "tama" }{ "_id" : ObjectId("4c49119983d1600c126d2148"), "name" : "goro", "dapple_color" : "gray" }
なんでも入るにゃー
![Page 17: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/17.jpg)
スケールするように設計されている
![Page 18: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/18.jpg)
• Google BigTable
• amazon Dynamo
• HBase
• Apache Casandra
• CounchDB
• MongoDB
• and more
![Page 19: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/19.jpg)
• Google BigTable
• amazon Dynamo
• HBase
• Apache Casandra
• CounchDB
• MongoDB
• and more
オープンソース
![Page 20: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/20.jpg)
• Google BigTable
• amazon Dynamo
• HBase
• Apache Casandra
• CounchDB
• MongoDB
• and more
今日はこれを見るにゃ
![Page 21: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/21.jpg)
もくじ
• NoSQL とは
• MongoDB について
• MongoMapper を使う
• まとめ
![Page 22: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/22.jpg)
MongoDBby 10gen
![Page 23: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/23.jpg)
MongoDB は、C++ で書かれた、オープンソースのドキュメント指向データベースである。 (wikipedia)
![Page 24: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/24.jpg)
MongoDB は、C++ で書かれた、オープンソースのドキュメント指向データベースである。 (wikipedia)
スケーラブル
ハイパフォーマンス
スキーマフリー
![Page 25: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/25.jpg)
• ドキュメント指向ストレージ (the simplicity and power of JSON-like data schemas)
• 動的な クエリー
• 組み込みのオブジェクトと配列をサポートした完全な Index のサポート。
• クエリー プロファイリング
• 速い in-place アップデート
• バイナリデータの効率的な保存 large objects (例:写真や動画)
• レプリケーション とフェイルオーバーのサポート。
• クラウドレベルのスケーラビリティな 自動的なsharding
• 複雑な集約のための MapReduce
• 商用サポート、ホスティング、コンサルティング
公式サイトより
![Page 26: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/26.jpg)
ドキュメント指向
![Page 27: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/27.jpg)
各ドキュメントがスキーマ情報を持つ
![Page 28: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/28.jpg)
?
![Page 29: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/29.jpg)
まずドキュメントってなに?
![Page 30: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/30.jpg)
コレクション ≒ テーブルドキュメント ≒ レコード
リレーショナルドキュメント指向
![Page 31: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/31.jpg)
各ドキュメントがスキーマ情報を持つ
![Page 32: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/32.jpg)
{ "_id" : ###, "name" : "tama" }
たま
ドキュメント
![Page 33: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/33.jpg)
{ "_id" : ###, "name" : "tama" }{ "_id" : ###, "name" : "goro", "dapple_color" : "gray" }
たま
コレクション
ごろう
![Page 34: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/34.jpg)
{ "_id" : ###, "name" : "tama" }{ "_id" : ###, "name" : "goro", "dapple_color" : "gray" }
たま
ごろう
![Page 35: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/35.jpg)
!
![Page 36: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/36.jpg)
導入事例
![Page 37: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/37.jpg)
over 200 projects
![Page 38: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/38.jpg)
もくじ
• NoSQL とは
• MongoDB について
• MongoMapper を使う
• まとめ
![Page 39: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/39.jpg)
MongoMapperhttp://github.com/jnunemaker/mongomapper
![Page 40: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/40.jpg)
ActiveRecord に似たAPI
+ 周辺ライブラリの充実
![Page 41: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/41.jpg)
gem install mongo_mapper
簡単にゃ
![Page 42: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/42.jpg)
使う
![Page 43: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/43.jpg)
class Cats include MongoMapper::Document
key :name, Stringend
![Page 44: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/44.jpg)
irb で使う
![Page 45: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/45.jpg)
class Cats include MongoMapper::Document
key :name, Stringend
![Page 46: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/46.jpg)
class Cats include MongoMapper::Document
key :name, Stringend
![Page 47: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/47.jpg)
class Cats include MongoMapper::Document
key :name, Stringend
![Page 48: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/48.jpg)
irb:001:0> Cats.create :name => 'tama'
irb:002:0> Cats.first
=> #<Cats name: "tama", _id: BSON::ObjectID('###')>
irb:003:0> Cats.create :name => 'goro', :dapple_color => ‘gray’
irb:004:0> Cats.count
=> 2
irb:005:0> Cats.first(:name => ‘goro’)
=> #<Cats name: "goro", dapple_color:”gray”,_id: ###>
![Page 49: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/49.jpg)
Array, Binary, Boolean, Date, Float, Hash
Integer, Nil, ObjectId, Set, String, Time
Custom Type, and TypeLess
![Page 50: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/50.jpg)
Array, Binary, Boolean, Date, Float, Hash
Integer, Nil, ObjectId, Set, String, Time
Custom Type, and TypeLess
TypeLessってにゃに?
![Page 51: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/51.jpg)
class Storage include MongoMapper::Document
key :valueend
![Page 52: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/52.jpg)
class Storage include MongoMapper::Document
key :valueend
![Page 53: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/53.jpg)
irb:001:0> Storage.create :values => 25
irb:002:0> Storage.create :value => 'String'
irb:003:0> Cats.all
=> [#<Storage value: 25, _id: BSON::ObjectID('###')>,
#<Storage value: “String”, _id: BSON::ObjectID('###')>]
![Page 54: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/54.jpg)
Array, Binary, Boolean, Date, Float, Hash
Integer, Nil, ObjectId, Set, String, Time
Custom Type, and TypeLess
にゃるほど!
![Page 55: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/55.jpg)
アソシエーション
![Page 56: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/56.jpg)
class Family include MongoMapper::Document key :name, String many :catsend
class Cats include MongoMapper::Document key :name, String key :family_id, ObjectId belongs_to :familyend
![Page 57: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/57.jpg)
class Person include MongoMapper::Document key :name, String one :addressend
class Address include MongoMapper::EmbeddedDocument key :zipcode, String key :street, Stringend
![Page 58: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/58.jpg)
バリデーション
![Page 59: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/59.jpg)
• validates_presence_of :title
• validates_presence_of
• validates_length_of
• validates_format_of
• validated_numericality_of
• validates_acceptance_of
• validated_configmati
![Page 60: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/60.jpg)
class Cats include MongoMapper::Document key :name, String
validates_presence_of :nameend
![Page 61: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/61.jpg)
class Cats include MongoMapper::Document key :name, String, :required => trueend
![Page 62: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/62.jpg)
class Cats include MongoMapper::Document key :name, String, :required => trueend
実は一緒にゃんです
![Page 63: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/63.jpg)
コールバック
![Page 64: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/64.jpg)
before / after
![Page 65: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/65.jpg)
validate, create, save
![Page 66: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/66.jpg)
class Cats include MongoMapper::Document key :name, String
before_validation :add_nyan
private def add_nyan self.name += ‘ nyan’ endend
![Page 67: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/67.jpg)
irb:001:0> Cats.create :name => 'tama'
irb:002:0> Cats.first
=> #<Cats name: "tama nyan", _id: BSON::ObjectID('###')>
![Page 68: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/68.jpg)
拡張する
![Page 69: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/69.jpg)
基本機能もプラグイン
![Page 70: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/70.jpg)
module Charisma def fly puts “I’m flying” endend
MongoMapper::Document. append_inclusions(Charisma)
Cats.first(:name => ‘tama’).fly
![Page 71: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/71.jpg)
module Charisma def fly puts “I’m flying” endend
MongoMapper::Document. append_inclusions(Charisma)
Cats.first(:name => ‘tama’).fly
実は飛べるにゃ
![Page 72: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/72.jpg)
もくじ
• NoSQL とは
• MongoDB について
• MongoMapper を使う
• まとめ
![Page 73: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/73.jpg)
MongoDB
![Page 74: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/74.jpg)
ドキュメント指向DB
と KVS と RDBMS
の良いとこどり
![Page 75: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/75.jpg)
MongoMapper
![Page 76: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/76.jpg)
ActiveRecord のように簡単に MongoDB
を利用できる
![Page 77: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/77.jpg)
使ってみるにゃ
![Page 78: NoSQL を Ruby で実践するための n 個の方法](https://reader034.vdocuments.pub/reader034/viewer/2022042521/5553aba2b4c905d9448b4876/html5/thumbnails/78.jpg)
参考 URL
• http://www.mongodb.org/
• http://www.mongodb.org/display/DOCSJP/Home
• http://wiki.github.com/jnunemaker/mongomapper/
• http://gihyo.jp/dev/serial/01/ruby/0033