20120831 mongoid
TRANSCRIPT
Mongoidを語ってみよう2012/08/31 @akimatter
13年1月24日木曜日
自己紹介秋間武志
RBCスタッフ
仕事でmongoidを使って約2年
株式会社グルーヴノーツ
@akimatter
https://github.com/akm
http://d.hatena.ne.jp/akm/
13年1月24日木曜日
アジェンダNoSQLのおさらい
MongoDBの概要
Mongoidの概要
Mongoid3の変更点
MongoDB 2.2の新機能
Mongoidでのモデリング
13年1月24日木曜日
NoSQLのおさらい
13年1月24日木曜日
NoSQLとはNoSQLとは、リレーショナルデータベース管理システム(RDBMS)以外のデータベース管理システムを指し、リレーショナルデータベースの長い歴史を打破するものとして、広い意味での関係モデル以外に属するデータベースの発展を促進させようとする運動である。
http://ja.wikipedia.org/wiki/NoSQL より
13年1月24日木曜日
実装産業界での有名な実装
GoogleのBigTable
アマゾンのAmazon DynamoDB
オープンソースの実装MongoDBApache HBaseApache Cassandra
13年1月24日木曜日
分散データベース
いくつかのNoSQLシステムは分散アーキテクチャを採用している
13年1月24日木曜日
CAP定理ブリュワーの定理とも呼ばれ、分散コンピュータシステムのマシン間の情報複製に関する定理。ウェブサービスを想定して作られた定理。同時に以下の3つを満たすことはできないというもの。
一貫性 (Consistency)
可用性 (Availability)
分断耐性 (Partition-tolerance)
13年1月24日木曜日
13年1月24日木曜日
13年1月24日木曜日
Eventually Consistency
システム内に、一時的にConsistentでない状態が生まれても、ある期間の後には、Consistentな状態になるような性質を、Eventually Consistencyという。
13年1月24日木曜日
Eventually Consistency
この言葉が定義されたことで「ScalableでAvailableで、かつ、Eventually Consistentなシステムは可能である。」と言うことが可能になった。
実際、mongoidにも、consistencyの選択肢に:eventual と :strongがある
13年1月24日木曜日
BASECAPの全部を満たさなくてもシステムとして十分
Basically Available
Soft-state
Eventually consistent
http://qcontokyo.com/tokyo-2009/pdf/GeneralSession-Day2-Maruyama.pdf
13年1月24日木曜日
MongoDBの概要
13年1月24日木曜日
特徴「MongoDB はドキュメント志向のDBMSです。 MySQLですがJSON型オブジェクトを伴い、RDBMS表ではなく、データモデルで構成されます。大切なことは、MongoDBは、結合やトランザクションをサポートしないということです。しかし二次的インデックスで、クエリ言語表示、アトミックがドキュメントレベルで書き込みを行い一貫した読み込みをするのを特徴とします。
操作上、MongoDBは、自動範囲ベース自動フェイルオーバーと水平スケーリングを内蔵する、マスタースレーブ・レプリケーションを特徴とします。」
http://jp.docs.mongodb.org/manual/faq/fundamentals/#what-kind-of-database-is-mongodb
13年1月24日木曜日
例えばこんな構成も
13年1月24日木曜日
分散アーキテクチャ
レプリケーション
マスター/スレイブ
レプリカセット
シャーディング
13年1月24日木曜日
JOINなし
「Mongoでは、リレーショナルデータベースのデザインでするような"正規化"はそれほど必要ありません。サーバサイドでの"join"がないからです。」
http://www.mongodb.org/pages/viewpage.action?pageId=7209156
13年1月24日木曜日
埋め込みドキュメントドキュメントに複数のドキュメントを埋め込むことができる
db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d734"), name: 'Ghanima', family: {mother: 'Chani', father: 'Paul', brother: ObjectId("4d85c7039ab0fd70a117d730")}})
http://www.mongodb.org/pages/viewpage.action?pageId=18907286
13年1月24日木曜日
組み込み vs 参照
http://www.mongodb.org/pages/viewpage.action?pageId=7209156
13年1月24日木曜日
トランザクションなし
「MongoDBは ACIDトランザクションを提供しません。」
http://jp.docs.mongodb.org/manual/faq/fundamentals/#does-mongodb-support-transactions
13年1月24日木曜日
アトミックな操作
「MongoDBは、一つのドキュメント でのアトミックな操作をサポートしています」
http://www.mongodb.org/pages/viewpage.action?pageId=7209573
13年1月24日木曜日
トランザクション
「トランザクションが満たすべき技術的要件にACID特性がある」
http://ja.wikipedia.org/wiki/トランザクション
13年1月24日木曜日
ACIDについて比較
http://ja.wikipedia.org/wiki/ACID_(コンピュータ科学)
RDB MongoDB
原子性 atomicity ○ △
一貫性 consistency ○ ○
独立性 isolation ○ ○
永続性 durability ○ ○
13年1月24日木曜日
consistencyという言葉「一貫性のあるサービスでは、操作は完了するか、一切何もしないかの、どちらかだ。 ギルバートとリンチは、一貫性ではなく原子性(atomic)という語を証明の中で使っている。 理論的な文脈では原子性という方が要領を得ている。 というのも細かい話をすると、一貫性(Consistent) は データベーストランザクションの望ましい性質をあらわす ACID の C に使われており、 これはあるデータが事前に与えられた制約を破った状態で残らないことを意味している。 ところが CAP の C を分散システムでの事前の制約とみなし、 同じデータをあらわす複数の値を許さないことにすると、抽象化が漏れて紛らわしいことになる。 (それに、もしブリュワーが原子性(atomic)という語を使っていたら AAP 定理になる。 こんなのを発音しようとしたら皆が病人みたいになってしまう。)」
http://www.hyuki.com/yukiwiki/wiki.cgi?BrewersCapTheorem
13年1月24日木曜日
Mongoidの概要
13年1月24日木曜日
ODM for MongoDB
Mongoid (pronounced mann-goyd) is an Object-Document-Mapper (ODM) for MongoDB written in Ruby. It was conceived in August, 2009 during a whiskey-induced evening at the infamous Oasis in Florida, USA by Durran Jordan.
http://mongoid.org/en/mongoid/index.html
13年1月24日木曜日
Mongoidの哲学
The philosophy of Mongoid is to provide a familiar API to Ruby developers who have been using Active Record or Data Mapper, while leveraging the power of MongoDB's schemaless and performant document-based design, dynamic queries, and atomic modifier operations.
MongoIdの哲学は、MongoDBのスキーマレスとパフォーマンスのドキュメントベースの設計、動的なクエリ、およびアトミックな更新操作のパワーを活用しながら、ActiveRecordやDataMapperを使用しているRubyの開発者におなじみのAPIを提供することです。
13年1月24日木曜日
Documents Fields
class Person include Mongoid::Document field :first_name, type: String field :middle_name, type: String field :last_name, type: Stringend
ArrayBigDecimalBooleanDateDateTimeFloatHashIntegerMoped::BSON::ObjectIdRangeRegexpStringSymbolTimeTimeWithZone
13年1月24日木曜日
Persistence StandardModel.create, Model.create!, Model#save, Model#save!, Model#update_attributes, Model#update_attributes!, Model#update_attribute, Model#upsert, Model#touch, Model#delete, Model#destroy, Model.delete_all, Model.destroy_all
この辺はActiveRecordと同じ感じ
13年1月24日木曜日
Persistence Atomic
Model#add_to_set, Model#bit, Model#inc, Model#pop, Model#pull, Model#pull_all, Model#push, Model#push_all, Model#rename, Model#set, Model#unset
コールバックもバリデーションも呼ばれないから要注意
13年1月24日木曜日
relationsActiveRecord Mongoid
ReferenceMongoidEmbed
belongs_to belongs_to embedded_in
has_many has_many embeds_many
has_one has_one embeds_one
has_and_belongs_to_many
has_and_belongs_to_many N/A
13年1月24日木曜日
IDの振り方ActiveRecordでは、RDBサーバのautoincrementのカラムをidとして使用する。
MongoDBでは主キーとなる_idの値はクライアントで生成する必要がある。 Mongoidではドライバのmopedが行う。この値はUUIDを用いる。衝突する可能性はxxxくらい。
13年1月24日木曜日
Mongoid3の変更点
13年1月24日木曜日
構造
13年1月24日木曜日
origin
One of MongoDB's greatest features is its ability to execute dynamic queries, which Origin abstracts in a familiar Arel-style DSL that Mongoid includes.
13年1月24日木曜日
moped
Goal of this gem
Thread-safe
No more extension (bson_ext)
Cleanest API
Better ReplicaSet management
13年1月24日木曜日
moped limitationLimitation
Ruby 1.9 only
No GridFS support
The only case where moped is slower than bson_ext is the ObjectId generation
13年1月24日木曜日
MongoDB2.2
13年1月24日木曜日
New FeaturesAggregation Framework
TTL Collections
Concurrency Improvements
Improved Data Center Awareness with Tag Aware Sharding
Fully Supported Read Preference Semantics
http://docs.mongodb.org/manual/release-notes/
13年1月24日木曜日
Mongoidでのモデリング
13年1月24日木曜日
Tengineの例
TengineはGroovenautsが開発している分散環境におけるイベントハンドリングおよびジョブの実行制御のためのフレームワーク
https://github.com/tengine/tengine
13年1月24日木曜日
分散処理でのカウント
13年1月24日木曜日
分散処理でのカウント
13年1月24日木曜日
分散処理でのカウント
13年1月24日木曜日
公式ドキュメントの例
http://mongoid.org/en/mongoid/docs/relations.html
13年1月24日木曜日
モデリングのポイント◦リレーショナルモデリングは利用可能なデータ構造駆動だ。この設計をするにあたって重要なテーマは"自分はどの答えを持っているか?"
◦NoSQLデータモデリングはアプリケーション特有のアクセスパターン、すなわち、サポートされるクエリの型駆動だ。メインテーマは"自分は何を知りたいのか?"
https://gist.github.com/2396234
13年1月24日木曜日
組み込み vs 参照 再び
http://www.mongodb.org/pages/viewpage.action?pageId=7209156
13年1月24日木曜日
関連テーブルとか
13年1月24日木曜日
関連テーブルとか
13年1月24日木曜日
参考文献12年後のCAP定理: "法則"はどのように変わったか
http://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed
MongoDBドキュメント
http://www.mongodb.org/display/DOCSJP/Home
Cloudの技術的特徴について 丸山先生
http://qcontokyo.com/tokyo-2009/pdf/GeneralSession-Day2-Maruyama.pdf
13年1月24日木曜日
参考文献
NoSQLデータモデリング技法
https://gist.github.com/2396234
ブリュワーの CAP 定理
http://www.hyuki.com/yukiwiki/wiki.cgi?BrewersCapTheorem
13年1月24日木曜日