À la suite d'un guide, j'ai exécuté la commande suivante:
Rails g migration CreateSnippetsUsers snippet:belongs_to user:belongs_to
Cela a créé la migration suivante:
class CreateSnippetsUsers < ActiveRecord::Migration[5.0]
def change
create_table :snippets_users do |t|
t.belongs_to :snippet, foreign_key: true
t.belongs_to :user, foreign_key: true
end
end
end
Dans le passé, j'ai vu la même chose, mais avec index: true
au lieu de foreign_key: true
. Quelle est la différence entre les deux?
L'index améliore la vitesse des opérations de récupération des données sur les tables de base de données. Lorsque nous écrivons index: true
à n'importe quelle colonne, il ajoute un index de base de données à cette colonne. Par exemple, je créais une table:
create_table :appointments do |t|
t.references :student, index: true
end
Cela créera student_id
colonne dans la table appointments
.
Une clé étrangère a un cas d'utilisation différent, c'est une relation entre les tables. Il nous permet de déclarer un index dans une table qui est lié à un index dans une autre table et aussi certaines contraintes sont placées. La base de données applique les règles de cette relation pour maintenir l'intégrité référentielle. Par exemple, nous avons deux tables profiles
et educations
, et un profil peut avoir plusieurs formations.
create_table :educations do |t|
t.belongs_to :profile, index: true, foreign_key: true
end
Maintenant nous avons profile_id
colonne de la table educations
qui est la clé étrangère de la table profiles
. Il empêche un enregistrement d'être entré dans la table educations
à moins qu'il ne contienne un profile_id
valeur qui existe dans la table profiles
. L'intégrité référentielle sera donc maintenue.