2016-03-28 10 views
1

モデルとテーブルをリンクするためにRailsにはさまざまな可能性があります。整数、インデックス付きカラム、外部キー、参照間の相違点とベストプラクティス

add_column :books, :user_id, :integer, index: true 
add_reference :books, :user, index: true, foreign_key: true 

私が読んだ限り、いくつかのデータベースはこのオプションに関する異なる動作をしていることがわかります。

私は、パフォーマンスとコードの可読性のために採用するベストプラクティスを見つけることに興味があります。

私は長い間、整数インデックス付きの列を使用していました。代わりにforeign_keysで参照を使用する必要があるかどうかを知りたいと思います。

UPDATE:

class CreateBooks < ActiveRecord::Migration 
    def change 
    create_table :books do |t| 
     t.integer :author_id 
     t.references :user, index: true, foreign_key: true 

     t.timestamps null: false 
    end 
    add_index :books, :author_id 
    end 
end 

テーブル

のDDLを:

rails g model book author_id:integer:index user:references 

移行ファイルは次のようになります。私が実行したブランドの新しいテストアプリでExemple

- 表:public.books

-- DROP TABLE public.books; 

CREATE TABLE public.books 
(
    id integer NOT NULL DEFAULT nextval('books_id_seq'::regclass), 
    author_id integer, 
    user_id integer, 
    created_at timestamp without time zone NOT NULL, 
    updated_at timestamp without time zone NOT NULL, 
    CONSTRAINT books_pkey PRIMARY KEY (id), 
    CONSTRAINT fk_rails_bc582ddd02 FOREIGN KEY (user_id) 
     REFERENCES public.users (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE public.books 
    OWNER TO my_user_name; 

-- Index: public.index_books_on_author_id 

-- DROP INDEX public.index_books_on_author_id; 

CREATE INDEX index_books_on_author_id 
    ON public.books 
    USING btree 
    (author_id); 

-- Index: public.index_books_on_user_id 

-- DROP INDEX public.index_books_on_user_id; 

CREATE INDEX index_books_on_user_id 
    ON public.books 
    USING btree 
    (user_id);  

EDIT 2:ここでは、問題を記述したリンクであるとFOREIGN_KEYSの重要性私のコメントに少し拡大

Link

+0

Postgres用に生成されたDDLを2つのオプションで投稿できますか?私は、実際の外部キー制約を作成するものと推測していますが、他のものはありませんが、Railsに精通しているわけではありません。 – Dmitri

+0

はい私はあなたが正しいと思います。私はもうすぐ詳細な情報を掲載します。 –

+0

DDLを追加しました。期待どおりに外部キーと2つのインデックスがあります。パフォーマンス/安定性の面で外来キーの有無に大きな違いはありますか? –

答えて

1

を指摘する:はい、外部キーの主な機能は、参照を維持することです完全性(https://en.wikipedia.org/wiki/Referential_integrity)。

これらは、スキーマに関する情報をより明示的に提供します。クエリおよび設計ツールは、共有列名に頼るのではなく、それらの関係を利用できます。

外部キーによるすべての列参照が索引付けされているかどうかを確認することも簡単です。そうでない場合は、問合せ時に欠落している索引のみが検出されることがあります。

http://www.postgresql.org/docs/current/static/ddl-constraints.html#DDL-CONSTRAINTS-FK

パフォーマンスへの影響は、程度の理由はとても簡単です:あなたは(挿入/更新/削除)子テーブルの変更でいつでもデータ親テーブルに対するインデックス・ルックアップを実行することになるだろう。ほとんどの中小型のテーブルでは、それを心配する必要はありません。

+0

Railsの 'references'は基本的に' foreign_key' + 'index'です。 – geoboy

関連する問題