MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में डेटा स्टोर करने का कुशल तरीका:एम्बेडेड दस्तावेज़ बनाम व्यक्तिगत दस्तावेज़

पहले दृष्टिकोण (व्यक्तिगत दस्तावेज़) का उपयोग करना और यदि संभव हो तो एक कैप्ड संग्रह का उपयोग करना बेहतर होगा, क्योंकि आप तेजी से बढ़ते संग्रह नहीं चाहते हैं (मोंगोइड को 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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. geoNear द्वारा उप दस्तावेज़ प्राप्त करता है - MongoDB

  2. MongoNetworkError:सर्वर से कनेक्ट करने में विफल [लोकलहोस्ट:27017] पहले कनेक्ट पर [MongoNetworkError:कनेक्ट ECONNREFUSED 127.0.0.1:27017]

  3. Mongoose में एक और स्कीमा का संदर्भ देना

  4. mongoDB में कुल मिलाकर यह परिणाम कैसे प्राप्त करें?

  5. मोंगो में पदावनत फ़ील्ड को कैसे हटाएं?