MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wydajny sposób przechowywania danych w MongoDB:dokumenty osadzone vs pojedyncze dokumenty

Lepiej byłoby zastosować pierwsze podejście (pojedyncze dokumenty) i jeśli to możliwe, użyć kolekcji ograniczonej, ponieważ nie chcesz mieć szybko rosnącej kolekcji (mongoid będzie miał obsługę kolekcji ograniczonych w wersji 2.2, która ukaże się w ten weekend). zgadnij).

Drugie podejście (dokumenty osadzone), musisz najpierw pobrać dokument główny dla użytkownika, a następnie przeszukać tablicę w aplikacji, aby znaleźć aktywność związaną z poszukiwanym postem. Mongoid może sprawiać wrażenie, jakby wszystko odbywało się w db ze względu na podobieństwo składni w znajdowaniu osadzonego dokumentu, ale tak naprawdę iteruje tablicę.

Ponieważ masz już user_id, activity_id i activity_type przed wykonaniem zapytania, a nie chcesz, aby cała lista aktywności użytkownika była pobierana z bazy danych, gdy szukasz określonej aktywności, wolę pierwszy przypadek. W aplikacji będzie znacznie mniej obliczeń (wyszukiwania) i będzie znacznie mniejszy ruch w sieci.

Przy podejściu do pojedynczych dokumentów byłoby świetnie, gdybyś stworzył również unikalny indeks na user_id, activity_id, activity_type. Pomoże Ci w ograniczeniu liczby dokumentów. Możesz mieć walidację unikatowości (dodatkowe zapytanie), ale byłoby to w większości niepotrzebne, jeśli masz unikalny indeks. Jedyną korzyścią z walidacji będzie błąd walidacji, jeśli istnieją duplikaty, ale indeks po cichu zignoruje zduplikowane wpisy, chyba że pozostaniesz w trybie awaryjnym.

Jeśli chcesz również zachować historyczną aktywność witryny, możesz mieć strukturę taką jak:

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. Jak zabezpieczyć pole hasła w Mongoose/MongoDB, aby nie zwracało się w zapytaniu, gdy wypełniam kolekcje?

  2. Jak grupować rekordy na podstawie elementów tablicy za pomocą MongoDB?

  3. Mongoose — Zapytanie o najnowszy dokument

  4. Jakie są ograniczenia indeksów częściowych?

  5. node.js mongodb javascript zamieszanie w zakresie zakresu