2016-03-28 11 views
1

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

Link

+0

İ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

+0

Evet, haklı olduğunuzu düşünüyorum. Yakında daha fazla bilgi yayınlayacağım. –

+0

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ı? –

cevap

1

işaret biraz: evet, yabancı anahtarların birincil işlevi referential korumaktır bütünlük (https://en.wikipedia.org/wiki/Referential_integrity).

Taraf yararı olarak, şemanız hakkında biraz daha açık bilgiler sağlarlar: sorgu ve tasarım araçları, paylaşılan sütun adlarına dayanmak yerine bu ilişkileri kullanabilir.

Ayrıca, yabancı anahtarlar tarafından yapılan tüm sütunların dizininin endekslendiğini kontrol etmek de kolaydır; aksi halde sorgulama zamanında yalnızca eksik bir dizin keşfedebilirsiniz.

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

performans etkileri

hakkında ikna etmeye oldukça kolaydır: Üst tabloya karşı bir indeks araması yaparak olacağız her bir alt tablo değişiklikleri verileri (ekleme/silme/güncelleme). Çoğu küçük-orta tablo için asla endişelenmenize gerek yok.

+0

Yani Rails temelde 'yabancı kaynaklar' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'dır. – geoboy

İlgili konular