MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Maneira eficiente de armazenar dados no MongoDB:documentos incorporados versus documentos individuais


Seria melhor usar a primeira abordagem (documentos individuais) e usar uma coleção limitada, se possível, pois você não deseja ter uma coleção de crescimento rápido (o mongoid terá suporte para coleções limitadas em 2.2, que sairia neste fim de semana. acho).

A segunda abordagem (documentos incorporados), você precisará primeiro buscar o documento raiz para o usuário e, em seguida, percorrer o array no aplicativo para encontrar a atividade relacionada à postagem que você está procurando. O Mongoid pode fazer parecer que tudo é feito em db devido à semelhança de sintaxe ao encontrar um documento incorporado, mas está realmente iterando a matriz.

Como você já tem o user_id, activity_id e activity_type antes de fazer uma consulta, e você não gostaria que toda a lista de atividades para o usuário fosse recuperada do db quando você estiver procurando por uma determinada atividade, vou preferir o primeiro caso. Haveria muito menos cálculos (pesquisa) no aplicativo e muito menos tráfego de rede.

Com a abordagem de documentos individuais, seria ótimo se você também criasse um índice exclusivo em user_id, activity_id, activity_type. Ele irá ajudá-lo a conter o número de documentos. Você pode ter a validação de exclusividade (consulta extra), mas isso seria desnecessário se você tivesse o índice exclusivo. O único benefício da validação será um erro de validação se houver duplicatas, mas o índice ignorará as entradas duplicadas silenciosamente, a menos que você persista no modo de segurança.

Caso você também queira que a atividade do site histórico seja persistente, você pode ter a estrutura como:
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