しゅがーブログ

技術ネタとか書いていけたらな…

【Rails】MongoDBとMySQLそれぞれへのindexの貼り方とか

Overview

いつも仕事でメインはMongoDB、サブはMySQLみたいな使い方をしていて、MySQLってどうやるんだっけ?と忘れることがあるのでその備忘。

MySQL

みなさんご存知のRDBです。
migrateを実行してDBに各種定義を反映していきます。

table & column作成

bundle exec rails g migration AddHogehogeTable 上記で作成されたmigrateファイルを編集します。

class AddHogehogeTable < ActiveRecord::Migration[5.X]
  def change
      create_table :hogehoges do |t|
         t.string :fugafuga
      end
  end
end

index作成

class AddHogehogeTable < ActiveRecord::Migration[5.X]
  def change
      create_table :hogehoges do |t|
         t.string :fugafuga
      end

      add_index :hogehoges, :fugafuga ← NEW
  end
end

migrate実行

ステータスの確認をしてupになっていれば問題なし。
あとはrails consoleからデータを作成できるかも確認しましょう。
bundle exec rake db:migrate
bundle exec rake db:migrate:status

MongoDB

NoSQL Databaseです。
基本モデルと連動しているので、再読み込みさせることによって各種定義が反映されます。

table(collection)作成

rails g model Hogehoge

column(field)作成

hogehogeファイルを開いて、下記を記載するだけ。
includeしているモジュールはmongoid(ORM)経由でMongoDBに定義するため必要なものになります。

class Hogehoge
  include Mongoid::Document

  field :fugafuga
end

index作成

# ターミナルにてrails consoleに入ります
$ bundle exec rails console -e development
略
pry(main)> Hogehoge.create_indexs # index作成
pry(main)> Hogehoge.collection.indexes.to_a # 作成されたindexが確認できる

まとめ

MongoDBはschema定義がそのままモデルに記載されているので、MySQLより簡単にDB定義を変更できます。
ですが、トランザクションがないため整合性を重要視するプロダクトには向かないかもです。(一応MongoDB4.0からトランザクション機能が増えたので、かなりよくなっているかもですが)
MySQLトランザクションがあるので、整合性に関しても安心できそうです。
その分こういうのがあったりしますが。
schema定義はそのままschema.rbにあるので見やすいですが、ある程度MongoDBに慣れてしまうとmigrate実行漏れがあったりするので気をつけましょう。