2011-08-24 2 views
2

사용자 활동 데이터 저장 : 사용자가 현재 기사, 주제 또는 개인 메시지를 방문하여 오프라인 상태에서 추가 된 새 메모 및 메시지 수를 표시합니다.효율적인 방법으로 MongoDB에 데이터 저장 : 임베디드 문서 대 개별 문서

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

이 경우 문서 당 하나의 레코드를 저장합니다. 내가 할 수있는 지금 그래서

class SiteActivity 
    include Mongoid::Document 
    belongs_to :user 
    embeds_many :user_activities 
    validates :user_id, uniqueness: true 
end 

class UserActivity 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    embedded_in :site_activity 
    belongs_to :activity, polymorphic: true 
end 

나는 모든 SiteActivities을 통해 (많은 많은 레코드) 검색 할 필요는 없지만 :

또 다른 옵션은 그래서 모든 사용자의 활동이 하나 개의 문서에 저장됩니다, 포함 된 문서를 사용하는 것입니다 current_user에 대해 하나의 user_activity을 가져 와서 임베디드 문서를 통해 필요한 활동을 찾으십시오.

데이터를 저장하고 검색하는 데 더 효율적인 방법은 무엇입니까?

내 일반적인 사용 사례는 다음과 같습니다

내가 사용자와 내가이 사용자가 게시 지난 번 방문했을 때 날짜를 보려면이 데이터 site_activity에 대한 인출하고, 그래서 게시물을 가지고있다. 내 첫 번째 옵션을

:

activity = SiteActivity.where(user_id: current_user.id, activity_id: post.id, activity_type: post.class) 

와 두 번째

user_activity = SiteActivity.where(user_id: current_user.id) 
activity = user_activity.user_activities.where(activity_id: post.id, activity_type: post.class) 

답변

1

당신으로, 첫 번째 방법 (개별 문서)를 사용하고 가능하면 덮인 모음을 사용하는 것이 좋을 것이다 급속도로 증가하는 컬렉션을 원하지는 않을 것입니다 (몽고이드는 이번 주말에 나올 것으로 예상되는 2.2 장의 콜렉션을 지원할 것입니다).

두 번째 방법 (포함 된 문서)을 사용하려면 먼저 사용자의 루트 문서를 가져온 다음 응용 프로그램에서 배열을 탐색하여 찾고있는 게시물과 관련된 활동을 찾아야합니다. 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 
+0

감사합니다. 이것은 내게 확신 한 것 같습니다 : – fl00r

+0

제 경우에는 동일한 물건 인'Mongoid :: Timestamps'를 사용하여 last_access_time으로'updated_at'을 추가하십시오. – fl00r

+0

네, 비슷하게 행동해야합니다. – rubish