MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Ефективен начин за съхраняване на данни в MongoDB:вградени документи срещу отделни документи

Би било по-добре да използвате първия подход (индивидуални документи) и да използвате ограничена колекция, ако е възможно, тъй като не искате да имате бързо нарастваща колекция (mongoid ще има поддръжка за ограничени колекции във 2.2, която ще излезе този уикенд I познайте).

При втория подход (вградени документи) ще трябва първо да извлечете основния документ за потребителя и след това да преминете през масива в приложението, за да намерите дейността, свързана с публикацията, която търсите. Mongoid може да изглежда така, сякаш всичко се прави в db поради сходството на синтаксиса при намирането на вграден документ, но наистина итерира масива.

Тъй като вече имате user_id, activity_id и activity_type, преди да направите заявка, и не бихте искали целият списък с дейности за потребителя да бъде извлечен от db, когато търсите конкретна дейност, аз ще предпочета първия случай. Ще има много по-малко изчисления (търсене) в приложението и ще има много по-малко мрежов трафик.

При подхода за индивидуални документи би било чудесно, ако създадете и уникален индекс за user_id, activity_id, activity_type. Това ще ви помогне да задържите броя на документите. Можете да имате проверка на уникалността (допълнителна заявка), но това би било най-вече ненужно, ако имате уникален индекс. Единственото предимство на валидирането ще бъде грешка при валидиране, ако има дубликати, но индексът ще игнорира дублиращите се записи тихо, освен ако не продължите да работите в безопасен режим.

В случай, че също така искате историческата активност на сайта да бъде запазена, можете да имате структура като:

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. Как да заредите първоначални данни в MongoDB?

  2. Актуализирайте поддокумент на MongoDB, когато родителският документ може да не съществува

  3. MongoDB findAndModify()

  4. Mongoose връща недефиниран за съществуващо поле

  5. ускорете обработката на голям набор от резултати с помощта на rmongodb