J'implémente des fonctionnalités pour suivre les articles qu'un utilisateur a lus.
create_table "article", :force => true do |t|
t.string "title"
t.text "content"
end
C'est 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. Y a-t-il une différence dans l'ordre de ces tableaux, devrait-il y avoir plus d'options ou quoi que ce soit? Ma base de données cible est Postgres.
add_index(:user_views, [:article_id, :user_id])
Merci.
MISE À JOUR:
Parce qu'une seule ligne contenant les mêmes valeurs dans les deux colonnes peut exister (car pour savoir si user_id HAS a lu article_id), dois-je considérer l'option: unique? Si je ne me trompe pas, cela signifie que je n'ai pas à faire de vérification par moi-même et à simplement faire une insertion chaque fois qu'un utilisateur visite un article.
la source
Réponses:
L'ordre importe dans l'indexation.
[:user_id, :article_id]
, vous pouvez effectuer une requête rapide suruser_id
ouuser_id AND article_id
, mais PAS surarticle_id
.Votre
add_index
ligne de migration doit ressembler à ceci:Question concernant l'option 'unique'
Un moyen simple de le faire dans Rails consiste à utiliser
validates
dans votre modèle avec la portéeuniqueness
suivante ( documentation ):la source
validates_uniqueness_of
(et son cousin,validates uniqueness:
) sont sujets aux conditions de courseJuste un avertissement sur la vérification de l'unicité au moment de la validation par rapport à l'index: ce dernier est fait par base de données tandis que l'amorce est faite par le modèle. Puisqu'il peut y avoir plusieurs instances simultanées d'un modèle en cours d'exécution en même temps, la validation est soumise à des conditions de concurrence, 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).
la source