121 votes

Index sur plusieurs colonnes dans Ruby on Rails

Je suis en train de mettre en place une fonctionnalité permettant de suivre les articles qu'un utilisateur a lus.

  create_table "article", :force => true do |t|
    t.string   "title"
    t.text     "content"
  end

Voici ma migration jusqu'à présent :

create_table :user_views do |t|
  t.integer :user_id
  t.integer :article_id
end

La table user_views sera toujours interrogée pour rechercher les deux colonnes, jamais une seule. Ma question est de savoir à quoi devrait ressembler mon index. Est-ce qu'il y a une différence dans l'ordre de ces tables, est-ce qu'il devrait y avoir plus d'options ou quoi que ce soit d'autre. Ma base de données cible est Postgres.

add_index(:user_views, [:article_id, :user_id])

Gracias.

UPDATE :
Comme il ne peut exister qu'une seule ligne contenant les mêmes valeurs dans les deux colonnes (puisqu'il s'agit de savoir si user_id a lu article_id), dois-je envisager l'option :unique ? Si je ne me trompe pas, cela signifie que je n'ai pas à faire de vérifications de mon côté et que je fais simplement une insertion à chaque fois qu'un utilisateur visite un article.

256voto

sscirrus Points 12987

L'ordre est important pour l'indexation.

  1. Placez le champ le plus sélectif en premier, c'est-à-dire le champ qui réduit le plus rapidement le nombre de lignes.
  2. L'index ne sera utilisé que dans la mesure où vous utilisez ses colonnes dans l'ordre commencer par le commencement . c'est-à-dire que si vous indexez sur [:user_id, :article_id] vous pouvez effectuer une recherche rapide sur user_id o user_id AND article_id mais PAS sur article_id .

Votre migration add_index devrait ressembler à ceci :

add_index :user_views, [:user_id, :article_id]

Question concernant l'option "unique

Une façon simple de le faire dans Rails est d'utiliser validates dans votre modèle avec des uniqueness comme suit ( la documentation ):

validates :user, uniqueness: { scope: :article }

35voto

olivier Points 291

Juste un avertissement concernant la vérification de l'unicité au moment de la validation par rapport à l'index : cette dernière est effectuée par la base de données alors que l'amorce est effectuée par le modèle. Comme il peut y avoir plusieurs instances concurrentes d'un modèle fonctionnant en même temps, la validation est sujette à des conditions de course, ce qui signifie qu'elle peut ne pas détecter les doublons dans certains cas (par exemple, soumettre deux fois le même formulaire exactement au même moment).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X