पहले दृष्टिकोण (व्यक्तिगत दस्तावेज़) का उपयोग करना और यदि संभव हो तो एक कैप्ड संग्रह का उपयोग करना बेहतर होगा, क्योंकि आप तेजी से बढ़ते संग्रह नहीं चाहते हैं (मोंगोइड को 2.2 में कैप्ड संग्रह के लिए समर्थन मिलेगा, जो इस सप्ताह के अंत में बाहर होगा I अनुमान)।
दूसरा दृष्टिकोण (एम्बेडेड दस्तावेज़), आपको पहले उपयोगकर्ता के लिए रूट दस्तावेज़ लाने की आवश्यकता होगी और फिर उस पोस्ट से संबंधित गतिविधि को खोजने के लिए आवेदन में सरणी को पार करना होगा जिसे आप ढूंढ रहे हैं। Mongoid ऐसा लग सकता है कि एम्बेडेड दस्तावेज़ खोजने में सिंटैक्स की समानता के कारण सब कुछ डीबी में किया जाता है, लेकिन यह वास्तव में सरणी को पुनरावृत्त करता है।
चूंकि आपके पास क्वेरी करने से पहले पहले से ही user_id, activity_id और activity_type है, और आप नहीं चाहेंगे कि जब आप किसी विशेष गतिविधि की तलाश में हों तो उपयोगकर्ता के लिए गतिविधियों की पूरी सूची डीबी से पुनर्प्राप्त की जाए, मैं पहले मामले को पसंद करूंगा। आवेदन में बहुत कम गणना (खोज) होगी और बहुत कम नेटवर्क ट्रैफ़िक होगा।
व्यक्तिगत दस्तावेज़ दृष्टिकोण के साथ, यह बहुत अच्छा होगा यदि आप 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