質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

317閲覧

Like modelのindexについて

ninginnn

総合スコア35

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/02/12 03:17

Railsでいいね機能を実装するときに質問なのですが
user_idとpost_idにindexやforeign_keyをつけるかみたいな話です。

もう一度整理したいので、質問致しました。

  • 複合インデックス
  • foreign_key
  • 単一のindex

について質問したいと思います。


私の考えでは,複合indexをつける必要があり、ここでは、

  • user一人当たりに一つの投稿に一回しかいいねができない。
  • 「一人がいいねしている複数投稿」を検索するときに、高速になる。

という認識で合っていますでしょうか?参照

Ruby

1add_index :likes, [:user_id, :post_id]#user一人当たりに一つの投稿に一回しかいいねができない


qiitaを参照して見ると、foreign_keyをつけている方が居ます。

ruby

1def change 2 create_table :likes do |t| 3 t.references :user, foreign_key: true, null: false 4 t.references :tweet, foreign_key: true, null: false 5 t.timestamps 6 end 7 end 8コード

ここで、foreign_keyをつけてしまうとuserやpostを削除するときに、likeテーブル(子テーブル)にuser_idが存在するから削除できない。となりますよね?
だからforeign_keyはつけるべきでないと思っています。

Ruby

1add_index :likes, :user 2add_index :likes, :post

単一のindexを付与すると、

  • 「誰がいいねをしているのか」を検索するときに早くなる
  • 「いいねしている投稿」を検索するときに早くなる。

と思うのですが、
前者は複合インデックスを作った方が早いのではないかと思ってしまします。
後者は複合インデックスの方が早いと思うのですが、つける意味はありますでしょうか?

私の認識で間違い等ありましたらご指摘願いたいです。
よろしくお願いいたしますm()m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①私の考えでは(中略)という認識で合っていますでしょうか?

これは特に問題ありません。

②だからforeign_keyはつけるべきでないと思っています。

削除する場合は、「データベースでON DELETE CASCADEをかける」「Railsでdependent: :destroyをかける」などすれば、自動的に関連づいたお気に入りも削除されますので、特に問題となりません。

それより、FOREIGN KEYをかけると、無関係な値が入らなくなるという大きなメリットがありますので、かけないことに正当な理由がある場合はかけておくことをおすすめします。

③単一のindexを付与すると

データベースエンジンにもよるかもしれませんが、複合インデックスは前の一部分だけ使うこともできます。なので、user_id, post_idの順でかかった複合インデックスは、user_idのインデックスとしても使うことができます。

逆に、post_idだけ検索する場合にはこのインデックスは役に立ちませんので、別途でpost_idだけのインデックスが必要です。

投稿2019/02/12 04:49

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ninginnn

2019/02/12 05:16

ご回答のほど有り難うございます。大変お勉強になります。 likeモデルを作ると、 ①「1つの投稿についている複数のいいね」を参照 ②「1人のしている複数のいいね」を参照 することが多いと思うのですが、 この場合は、post_idだけのインデックス、あるいは post_id, user_idの複合インデックス のどちらの方が良いでしょうか?
maisumakun

2019/02/12 05:20

post_idとuser_idの両方に条件を掛ける場合は(user_id, post_id)の複合インデックスがありますので、post_idにインデックスをかける場合に、そちらまで複合インデックスにする意味はあまりありません。
ninginnn

2019/02/12 05:25

有り難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問