Modelleri ve tabloları birbirine bağlamak için Rails'de farklı olasılıklar vardır.Tamsayı, dizinlenmiş sütun, yabancı anahtar, farklar ve en iyi uygulamalar
add_column :books, :user_id, :integer, index: true
add_reference :books, :user, index: true, foreign_key: true
Bildiğim kadarıyla okudum gibi, bazı Veritabanları bu seçenekler konusunda farklı davranışlara sahip olduğunu görüyoruz.
Performansları ve kod okunabilirliğini benimsemek için en iyi uygulamanın hangisi olduğunu bulmakla ilgileniyorum.
Uzun bir süre için tamsayı dizinli sütun kullanıyordum ve bunun yerine yabancı_ anahtarlar ile başvuru kullanmalı mıyım bilmek istiyorum.
GÜNCELLEME:
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
masanın
için ddl:rails g model book author_id:integer:index user:references
geçiş dosyası gibi görünüyor: Ben koşuyoruz yepyeni bir test uygulamasında Exemple
- Tablo: 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);
DÜZENLEME 2: Burada sorunu tarif bir bağlantı olup foreign_keys önemini benim yorumum Genişleyen
İki seçenek tarafından Postgres için oluşturulan DDL'yi kaydeder misiniz? Sanırım biri yaratıyor ve gerçek bir yabancı anahtar kısıtlaması var, diğeri yapmıyor, ama ben Rails'de çok iyi bir şey değilim. – Dmitri
Evet, haklı olduğunuzu düşünüyorum. Yakında daha fazla bilgi yayınlayacağım. –
DDL'yi ekledim, bir yabancı anahtar ve beklendiği gibi iki dizin var. Performans/istikrar açısından yabancı anahtarla ve arasında büyük bir fark var mı? –