MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara efisien untuk menyimpan data di MongoDB:dokumen tersemat vs dokumen individual

Akan lebih baik menggunakan pendekatan pertama (dokumen individual) dan menggunakan koleksi yang dibatasi jika memungkinkan, karena Anda tidak ingin memiliki koleksi yang berkembang pesat (mongoid akan memiliki dukungan untuk koleksi yang dibatasi di 2.2, yang akan keluar akhir pekan ini saya tebak).

Pendekatan kedua (dokumen yang disematkan), Anda harus terlebih dahulu mengambil dokumen root untuk pengguna dan kemudian melintasi larik dalam aplikasi untuk menemukan aktivitas yang terkait dengan pos yang Anda cari. Mongoid mungkin membuatnya tampak seperti semuanya dilakukan dalam db karena kesamaan sintaks dalam menemukan dokumen yang disematkan, tetapi itu benar-benar mengulangi array.

Karena Anda sudah memiliki user_id, activity_id dan activity_type sebelum membuat kueri, dan Anda tidak ingin seluruh daftar aktivitas untuk pengguna diambil dari db ketika Anda mencari aktivitas tertentu, saya akan memilih kasus pertama. Akan ada lebih sedikit perhitungan (pencarian) dalam aplikasi dan lalu lintas jaringan akan jauh lebih sedikit.

Dengan pendekatan dokumen individual, alangkah baiknya jika Anda juga membuat indeks unik pada user_id, activity_id, activity_type. Ini akan membantu Anda memuat jumlah dokumen. Anda dapat memiliki validasi keunikan (permintaan tambahan), tetapi itu sebagian besar tidak perlu jika Anda memiliki file index. Satu-satunya manfaat validasi adalah kesalahan validasi jika ada duplikat, tetapi indeks akan mengabaikan entri duplikat secara diam-diam kecuali Anda tetap dalam mode aman.

Jika Anda juga ingin aktivitas situs historis dipertahankan, Anda dapat memiliki struktur seperti:

class SiteActivity
  include Mongoid::Document
  include Mongoid::Timestamps
  belongs_to :user
  belongs_to :activity, polymorphic: true

  index [:user_id, :activity_id, :activity_type], :background => true, :unique => true

  field :last_access_time, :type => Time
  # last_access_times just here for history, not used
  field :last_access_times, :type => Array, :default => []
end

activity = SiteActivity.find_or_initialize_by(:user_id => current_user.id,
               :activity_id => post.id, :activity_type => post.class)
time = Time.now.utc
activity.last_access_time = time
activity.last_access_times << time
activity.save


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Batasi Beberapa Ukuran Array MongoDB

  2. Cara lebih mudah untuk Memperbarui Array dengan MongoDB

  3. Mongodb node.js $out dengan agregasi hanya berfungsi jika memanggil toArray()

  4. Peningkatan otomatis di MongoDB untuk menyimpan urutan ID Pengguna Unik

  5. Solusi untuk FindAndModify Massal di MongoDB