Ich implementiere Funktionen, um zu verfolgen, welche Artikel ein Benutzer gelesen hat.
create_table "article", :force => true do |t|
t.string "title"
t.text "content"
end
Dies ist meine bisherige Migration:
create_table :user_views do |t|
t.integer :user_id
t.integer :article_id
end
Die Tabelle user_views wird immer abgefragt, um nach beiden Spalten zu suchen, niemals nur nach einer. Meine Frage ist, wie mein Index aussehen soll. Gibt es einen Unterschied in der Reihenfolge dieser Tabellen, sollte es weitere Optionen geben oder was auch immer. Meine Ziel-DB ist Postgres.
add_index(:user_views, [:article_id, :user_id])
Vielen Dank.
UPDATE:
Da nur eine Zeile mit denselben Werten in beiden Spalten vorhanden sein kann (da ich weiß, ob user_id article_id gelesen hat), sollte ich die Option: unique berücksichtigen? Wenn ich mich nicht irre, bedeutet dies, dass ich nicht jedes Mal selbst nachsehen und einfach jedes Mal eine Einfügung vornehmen muss, wenn ein Benutzer einen Artikel besucht.
quelle
Antworten:
Die Reihenfolge spielt bei der Indizierung eine Rolle.
[:user_id, :article_id]
, können Sie eine schnelle Abfrage füruser_id
oder ausführenuser_id AND article_id
, jedoch NICHT fürarticle_id
.Ihre Migrationslinie
add_index
sollte ungefähr so aussehen:Frage zur "einzigartigen" Option
Eine einfache Möglichkeit, dies in Rails zu tun, besteht darin,
validates
in Ihrem Modelluniqueness
Folgendes zu verwenden ( Dokumentation ):quelle
validates_uniqueness_of
(und sein Cousinvalidates uniqueness:
) anfällig für Rennbedingungen sindNur eine Warnung zur Überprüfung der Eindeutigkeit zum Zeitpunkt der Validierung im Vergleich zum Index: Letzteres wird von der Datenbank ausgeführt, während der Primer vom Modell ausgeführt wird. Da möglicherweise mehrere Instanzen eines Modells gleichzeitig ausgeführt werden, unterliegt die Validierung den Rennbedingungen. Dies bedeutet, dass in einigen Fällen möglicherweise keine Duplikate erkannt werden (z. B. zweimal zur gleichen Zeit dasselbe Formular einreichen).
quelle