モデルとテーブルをリンクするために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の重要性私のコメントに少し拡大
Postgres用に生成されたDDLを2つのオプションで投稿できますか?私は、実際の外部キー制約を作成するものと推測していますが、他のものはありませんが、Railsに精通しているわけではありません。 – Dmitri
はい私はあなたが正しいと思います。私はもうすぐ詳細な情報を掲載します。 –
DDLを追加しました。期待どおりに外部キーと2つのインデックスがあります。パフォーマンス/安定性の面で外来キーの有無に大きな違いはありますか? –