2017-08-13 11 views
5

एक /login एपीआई, जहां, साख का मिलान सेट के लिए, संग्रह से एक उपयोगकर्ता वस्तु किया जाना चाहिये, जो दृष्टिकोण अधिक performant होगा के मामले मान लिया जाये:क्या मैं एक विस्तृत मोंगोज़ मॉडल को विभाजित करने से बेहतर हूं?

1) एक प्रक्षेपण प्रश्नों के साथ मॉडल:

var UserSchema = new Schema({ 
    name  : String, 
    email  : String, 
    dob   : Number, 
    phone  : Number, 
    gender  : String, 
    location : Object, // GeoJSON format {type: 'Point', geometry: { lat: '23.00', lng: '102.23' }} 
    followers : [UserSchema], 
    following : [UserSchema], 
    posts  : [PostSchema], 
    groups  : [GroupSchema] 
    // ... and so on 
}); 

2) स्प्लिट मॉडल:

var UserMinimalSchema = new Schema({ 
    name  : String, 
    email  : String, 
    phone  : Number, 
    location : Object, 
}); 

var UserDetailSchema = new Schema({ 
    dob   : Number, 
    gender  : String, 
    followers : [UserSchema], 
    following : [UserSchema], 
    posts  : [PostSchema], 
    groups  : [GroupSchema] 
    // ... and so on 
}); 

मान लीजिए:

012,
  1. एक लॉग-इन उपयोगकर्ता के लिए, केवल id, name, email, phone और location लौटा दी हैं।

  2. पहला मॉडल गुणों को वापस करने के लिए प्रक्षेपण क्वेरी का उपयोग करेगा (1)।

  3. दूसरे मामले में, केवल UserMinimalSchema पूरे दस्तावेज़ से पूछताछ के लिए उपयोग किया जाएगा।

  4. अनिवार्य रूप से दोनों प्रश्न (1) में वर्णित डेटा के बराबर मात्रा में लौटते हैं।

  5. मान लें कि औसत उपयोगकर्ता वस्तु ~ 16MB सीमा है और 1 मिलियन रिकॉर्ड हैं।

अगर किसी ऐसी परीक्षा/लिंक प्रलेखन के लिए किया जाता है, यह कितना विभाजित है या नहीं कोई फर्क होगा देखने के लिए बहुत मदद की होगी।

उत्तर

1

मैं विभाजन मॉडलों का प्रयोग नहीं होगा:

  1. आप
  2. आप अपने डेटा भंडारण में वृद्धि कर रहे हैं आबादी क्वेरी हर आप उपयोगकर्ता के डाटा के सभी देखना चाहते हैं प्रदर्शन करने के लिए होगा (आप अब होगा उपयोगकर्ता को अपने उपयोगकर्ता विवरण स्कीमा में संदर्भित करना होगा।
  3. जब मोंगो एक लुकअप करेगा, तो मॉडल मॉडल के संदर्भ पाएंगे और केवल आपके प्रक्षेपण क्वेरी में निर्दिष्ट डेटा निकालेंगे। यह पूरे लोड नहीं होगा जब तक आप अपनी क्वेरी में निर्दिष्ट नहीं करते हैं तब तक स्मृति में ऑब्जेक्ट करें।
+0

मुझे संदेह है (3) भी मामला होने के लिए। मुझे समझ में नहीं आता (1), 'UserMinimalSchema' में गुण' UserDetailSchema' में मौजूद नहीं हैं? यदि आप लिंक प्रदान कर सकते हैं जो साबित करते हैं (3) यह बहुत मददगार होगा, क्योंकि मुझे उम्मीद है कि ऐसा होने की संभावना है लेकिन इसे कहीं भी नहीं मिला। –

+0

@AmreshVenugopal आप सही हैं। मैंने सोचा था कि आप दोनों स्कीमा में कुछ विवरण स्टोर करना चाहते थे, लेकिन करीब निरीक्षण पर आप उन्हें विशिष्ट रूप से विभाजित कर रहे हैं। हालांकि यह एक और con उठाता है क्योंकि यदि आप सभी उपयोगकर्ता की जानकारी चाहते हैं तो आपको उपयोगकर्ता को पॉप्युलेट करने के लिए एक अतिरिक्त कदम उठाना होगा। अधिक विचारों के साथ उत्तर अद्यतन कर रहा है। –

संबंधित मुद्दे