QA@IT

ActiveRecordからMongoidへの移行を楽にするツールはありませんか?

2424 PV

現在Rails3.2のActiveRecord(MySQL)で開発している環境をMongoid+MongoDBに変更しようと考えています。

Mongoidのモデルのスキーマは、移行時にはActiveRecordのスキーマから変更しないつもりです(ただし_idは自動生成で追加)。

スキーマ定義はActiveRecordのschema.rbを参考に手で記述、データの移行はJSON形式でエクスポート/インポート後、関連をObject IDに変更することになると想定していますが、この作業を楽にするツールはないでしょうか?(自動化できるとベストです。)

回答

ActiveRecordとMongoidではインピーダンスミスマッチが大きいので、規模にもよりますが移行は簡単ではないと思います。

たとえば、has_manyをembeds_manyにするかreferences_manyにするか、といった判断には、更新の頻度やサイズ、参照の局所性やトランザクションの有無など、さまざまな制約からくる考慮点があり、アプリケーションの特性にあわせて意思決定する必要があります。

個人的な経験ですが、「スキーマを変えずに移行できる」ようなデータ構造の場合、MySQLからMongoDBへの移行はおそらくあまり大きなメリットを生まないと思います。規模が大きくなるにつれ、性能面や運用面でおおむねInnoDBに比べて劣化するケースが多いように感じています。(レプリカセットで自動フェイルオーバーできるという長所はそれを補って余りある、ともいえそうですが)

個人的にMongoDBの長所を生かせてるなと感じている成功例は、RDBではうまく扱えないような、カラムの数が不定であったりすごく多かったりするケース(たとえば30日分のデータを30個のカラムとして持たせておいても、それを60日分に変えたりするのが簡単)で、RDBなら列を行に展開した別テーブルを作って必ず一回ジョインしないと扱えなかったものが、一個のレコードにまとまっていると、データ構造が直感的になって扱いやすくなると同時に参照の局所性も高まる(物理的に同じページに乗っているのでランダムアクセスが複数回発生しない)ので性能もRDBに比べて良くなります。

同様の理由で、記事+コメントのように、主と従のデータが必ずセットでアクセスされるようなケース(このQA@ITとかもそうですね)もMongoDB向きだと思います。誤解を恐れずに一般論でいうと、embeds_manyをうまく使えている場面ではおおむねMongoDBの長所を生かしていて、references_manyを使わなければいけないシチュエーションはペナルティだけ払ってる(RDBのほうがよかった)、ということがいえるかもしれません。

そういう向き不向きがあるので、私は ActiveRecord (MySQL) と Mongoid (MongoDB) を同一プロジェクトで共存させて使い分けています。モデル数が100個以上あるそれなりの規模のプロジェクトですが、比率でいうとActiveRecord : Mongoid = 8 : 2といった感じです。

せっかくなので、移行を単調作業とみなして自動化を目指すよりも、そういう両者の特性の違いについての理解を深める良い機会だととらえて、じっくり手作業で取り組まれるのがよいのではないでしょうか。

編集 履歴 (2)
  • 非常に参考になる情報とアドバイスをありがとうございました。まだ開発途中で、MongoDBに対する知識も浅いので、まずはスキーマを変えずに移行して、そこからリファクタリング的にMongoDBに合ったスキーマに変更していこうと考えています。確かにデータ構造の違いが大きいので、ActiveRecordから単純に変換するようなツールに対するニーズはそもそも少ないのかもしれませんね。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。