web-dev-qa-db-fra.com

index: true vs foreign_key: true (Rails)

À 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?

15
Mirror318

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.

13
Mritunjay Upadhyay