Saya menerapkan fungsionalitas untuk melacak artikel mana yang telah dibaca pengguna.
create_table "article", :force => true do |t|
t.string "title"
t.text "content"
end
Ini migrasi saya sejauh ini:
create_table :user_views do |t|
t.integer :user_id
t.integer :article_id
end
Tabel user_views akan selalu ditanyai untuk mencari kedua kolom, tidak hanya satu. Pertanyaan saya adalah bagaimana tampilan indeks saya. Apakah ada perbedaan dalam urutan tabel ini, apakah ada lebih banyak pilihan untuk itu atau apapun. DB target saya adalah Postgres.
add_index(:user_views, [:article_id, :user_id])
Terima kasih.
UPDATE:
Karena hanya satu baris yang berisi nilai yang sama di kedua kolom yang dapat ada (karena dengan mengetahui apakah user_id TELAH membaca article_id), haruskah saya mempertimbangkan opsi: unik? Jika saya tidak salah, itu berarti saya tidak perlu melakukan pemeriksaan sendiri dan cukup membuat sisipan setiap kali pengguna mengunjungi artikel.
ruby-on-rails
ruby-on-rails-3
database-design
indexing
Emil Ahlbäck
sumber
sumber
Jawaban:
Urutan penting dalam pengindeksan.
[:user_id, :article_id]
, Anda dapat melakukan kueri cepat padauser_id
atauuser_id AND article_id
, tetapi TIDAK aktifarticle_id
.add_index
Garis migrasi Anda akan terlihat seperti ini:Pertanyaan tentang opsi 'unik'
Cara mudah untuk melakukan ini di Rails adalah dengan menggunakan
validates
model Anda dengan cakupanuniqueness
sebagai berikut ( dokumentasi ):sumber
validates_uniqueness_of
(dan sepupunya,validates uniqueness:
) rentan terhadap kondisi balapanHanya peringatan tentang memeriksa keunikan pada waktu validasi vs. pada indeks: yang terakhir dilakukan oleh database sedangkan primer dilakukan oleh model. Karena mungkin ada beberapa contoh bersamaan dari model yang berjalan pada waktu yang sama, validasi tunduk pada kondisi balapan, yang berarti mungkin gagal mendeteksi duplikat dalam beberapa kasus (misalnya, mengirimkan formulir yang sama dua kali pada waktu yang sama).
sumber