[解決済み] Railsのテーブルでどのようなインデックスを追加するか
質問
Railsのデータベースについて質問です。
- xxx_id"のような全ての外部キーに"index"を追加すべきでしょうか?
- 自動的に作成される "id" 列に "index" を追加する必要がありますか?
-
自動的に作成された "id" カラムに "index(unique)" を追加する必要がありますか?
-
2つの外部キーに一度にインデックスを追加した場合 (
add_index (:users, [:category, :state_id])
にインデックスを追加すると、どうなりますか? これは、それぞれのキーにインデックスを追加するのとどう違うのでしょうか?class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.string :name t.integer :category_id t.integer :state_id t.string :email t.boolean :activated t.timestamps end # Do I need this? Is it meaningless to add the index to the primary key? # If so, do I need :unique => true ? add_index :users, :id # I don't think I need ":unique => true here", right? add_index :users, :category_id # Should I need this? add_index :users, :state_id # Should I need this? # Are the above the same as the following? add_index (:users, [:category, :state_id]) end end
ここまでは素晴らしい回答です。追加の質問です。
- xxx_idに"index with unique"を追加すればいいんですよね?
どのように解決するには?
<ブロッククオートxxx_id"のように、すべての外部キーに"index"を追加する必要がありますか?
その方が、このカラムでソートする際の検索が高速化されるため、良いと思います。そして、外部キーはよく検索されるものです。
railsのバージョン5以降では、インデックスは自動的に作成されます。 を参照してください。 .
<ブロッククオート自動作成された"id"列に"index"を追加する必要がありますか?
いいえ、これはすでにrailsによって行われています
自動的に作成された "id" カラムに "index(unique)" を追加する必要がありますか?
いいえ、上記と同じです。
<ブロッククオート
一度に2つの外部キーにインデックスを追加した場合 (
add_index (:users, [:category_id, :state_id])
にインデックスを追加すると、どうなりますか? これは、それぞれのキーにインデックスを追加するのとどう違うのでしょうか?
では、インデックスは2つのカラムの結合インデックスになります。これは、1つの
category_id
AND
一つ
state_id
(本来は
category_id
ではなく
category
) を同時に使用します。
このようなIndexは、次のようなリクエストを高速化します。
# rails 2
User.find(:all, :conditions => { :state_id => some_id, :category_id => some_other_id })
# rails 3
User.where(:state_id => some_id, :category_id => some_other_id)
ここで
add_index :users, :category_id
add_index :users, :state_id
はこれらのリクエストを高速化します。
# rails 2+3
User.find_by_category_id(some_id)
User.find_by_state_id(some_other_id)
# or
# rails 2
User.find(:all, :conditions => {:category_id => some_id})
User.find(:all, :conditions => {:state_id => some_other_id})
# rails 3
User.where(:category_id => some_id)
User.where(:state_id => some_other_id)
xxx_idにquot;index with unique"を追加すればいいんですよね?
いや、そうすると、1つのカテゴリには1人のユーザーしか入れなくなりますが、カテゴリの意味は、より多くの
たくさん
のユーザーを1つのカテゴリに入れることができるということです。あなたの
User
モデルには次のようなものがあります。
belongs_to :category
そして、Categoryモデルには以下のようなものがあります。
has_many :users
. もし
has_many
の関係がある場合は
foreign_key
フィールドは一意であってはなりません!
関連
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
mysql5.7のインストールと、無料・長期利用を目的としたNavicateの導入プロセスについて
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] SQLでカラムに最大値を持つ行のみを選択する [重複]。
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのWhereの使用方法について説明します。
-
MySQL サービスとデータベース管理
-
Mysqlのソート機能の詳細
-
SQLステートメントエラーです。オペランドには 1 つのカラムを含める必要があります [括弧を追加せずに複数のフィールドをクエリする
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
MySQLの起動エラー:ERROR 2003 (HY000)。localhost'上のMySQLサーバーに接続できない(10061)
-
MySQL 接続タイムアウト。エラー SQLSTATE[HY000] [2002] 接続がタイムアウトしました 解決済み
-
[解決済み] Mysqlでidを使用してテーブルから多くの行を削除する
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?