2014-11-29 9 views
7

Rails 4.2 supporta recente aggiunta e la rimozione chiavi esterne (in migrazioni), come:Rails 4.2 stranieri chiave

# add a foreign key to `articles.author_id` referencing `authors.id` 
add_foreign_key :articles, :authors 

Quello che non capisco è: Come è

add_foreign_key :articles, :authors 

diverso da this:

add_column :articles, :author_id, :integer 

Grazie per qualsiasi chiarimento!

risposta

9

La differenza è che la linea:

add_foreign_key :articles, :authors 

sarà effettivamente genera questo:

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id"); 

Mentre questo:

add_column :articles, :author_id, :integer 

genererà:

ALTER TABLE "articles" ADD COLUMN author_id INT(11); 

Entrambi sono diversi perché add_foreign_key aggiungerà solo un vincolo foreign key, mentre add_column aggiunge una colonna non un vincolo.

+0

Grazie. Quindi è corretto concludere che l'utilizzo di '' 'add_foreign_key''' risulterà in prestazioni migliori del database (perché aggiunge una chiave esterna)? – TomDogg

+1

tecnicamente, * diminuisce * 'prestazioni del database' perché costringe il DB a controllare questo vincolo per ogni aggiornamento/inserimento. Ma aggiunge "integrità referenziale", cioè assicura che i tuoi dati "abbiano senso" e non ottieni dati incoerenti/orfani – mmcrae