0

次のコマンドに基づいて、既存のデータベースの主キーを自動生成されたシステムから複合キーに変更するための移行を追加しました。

add_index :listings, [:telephone, :name, :latitude, :longitude] , :unique=>true

私の質問は次のとおりです。

  1. コマンドによって生成されたインデックスは整数になりますか? すべてのパラメータ フィールドが文字列であるためです。

  2. データベースが作成された後にこのコマンドを実行すると、すべての行のキーが再生成されますか、それとも別のコマンドを実行する必要がありますか?

  3. このコマンドを実行すると違いはありますか? テーブルに行が追加された後にこれを実行するのではなく、これを実行したときにテーブルに行がなかった場合は?

ありがとう

以下の投稿を読んだ後に編集:========================================== =========

これは私のモデルです:

# Table name: listings
#
#  id                :integer         not null, primary key
#  name              :string(50)      default("ERROR:Not Available"), not null
#  telephone         :string(15)      default("ERROR:Not Available"), not null
#  latitude          :string(15)      default("ERROR:Not Available"), not null
#  longitude         :string(15)      default("ERROR:Not Available"), not null
#  avatar           :string(30)      default("Not Available")

ご覧のとおり、主キーはシステムによって自動生成された ID です 上記のコマンドを追加すると、正確には何が行われるのでしょうか? 4 つの列の値に基づいて生成された整数になるように id フィールドを変更したと思います。

ご想像のとおり、同じ名前の人が 2 人以上存在する可能性があります。したがって、ここで一意性を保証する唯一の真の方法は、4 つの列に基づいてある種のインデックスを作成することです。

上記のコマンドを使用して、正しいことを行っていますか? それはクエリを高速化するために機能しますか?

4

1 に答える 1

2
  1. それはあなたの主キーを変更しません。クエリのパフォーマンスを向上させるために使用される作成とインデックスのみ (正しく使用されている場合)
  2. インデックスには型がありません。列ではなく、マップのようなものです。
  3. Rails は複合キーをサポートしていないようです。

多分あなたのための解決策: http://compositekeys.rubyforge.org/


編集: 唯一の懸念が一意性である場合は、Active Record (Rails のモデル) には検証機能が付属していることに注意してください。そのため、提案するためのインデックスを作成する必要はなく、作成 ID を作成する必要もありません。

+info => http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness

また、データベース インデックスとは何かを確認することもできます: http://en.wikipedia.org/wiki/Database_index

それを読んだ後、次のようなクエリを高速化する必要がある場合、そのインデックスを作成する唯一の理由を理解する必要があります。

SELECT * FROM listings WHERE telephone=123123 AND name="John" AND latitude=123 AND longitude=323

そして、これらすべての値をすでに知っている場合、そのようなクエリを作成する必要はないと確信しています。

于 2012-04-28T16:30:13.923 に答える