2011-06-11 15 views
10

मैं अपनी अस्वीकार संग्रह कंपनी के लिए रूट ट्रैकिंग/ऑप्टिमाइज़ेशन सॉफ़्टवेयर विकसित करने की प्रक्रिया में हूं और मेरी वर्तमान डेटा संरचना/स्थिति पर कुछ फीडबैक चाहूंगा। डेटा संग्रह सभी ग्राहक डेटा वाली -मोंगोडीबी डाटाबेस स्ट्रक्चर और बेस्ट प्रैक्टिस मदद

"ग्राहकों":

डेटाबेस:: डेटा

संग्रह

यहाँ मेरी MongoDB संरचना का एक सरलीकृत संस्करण है।

[ 
    { 
     "cust_id": "1001", 
     "name": "Customer 1", 
     "address": "123 Fake St", 
     "city": "Boston" 
    }, 
    { 
     "cust_id": "1002", 
     "name": "Customer 2", 
     "address": "123 Real St", 
     "city": "Boston" 
     }, 
    { 
     "cust_id": "1003", 
     "name": "Customer 3", 
     "address": "12 Elm St", 
     "city": "Boston" 
    }, 
    { 
     "cust_id": "1004", 
     "name": "Customer 4", 
     "address": "16 Union St", 
     "city": "Boston" 
     }, 
    { 
     "cust_id": "1005", 
     "name": "Customer 5", 
     "address": "13 Massachusetts Ave", 
     "city": "Boston" 
    }, { ... }, { ... }, ... 
] 

"ट्रकों" - डेटा सभी ट्रक डेटा वाली संग्रह।

[ 
    { 
     "truckid": "21", 
     "type": "Refuse", 
     "year": "2011", 
     "make": "Mack", 
     "model": "TerraPro Cabover", 
     "body": "Mcneilus Rear Loader XC", 
     "capacity": "25 cubic yards" 
    }, 
    { 
     "truckid": "22", 
     "type": "Refuse", 
     "year": "2009", 
     "make": "Mack", 
     "model": "TerraPro Cabover", 
     "body": "Mcneilus Rear Loader XC", 
     "capacity": "25 cubic yards" 
    }, 
    { 
     "truckid": "12", 
     "type": "Dump", 
     "year": "2006", 
     "make": "Chevrolet", 
     "model": "C3500 HD", 
     "body": "Rugby Hydraulic Dump", 
     "capacity": "15 cubic yards" 
    } 
] 

"ड्राइवरों" - डेटा सभी ड्राइवर डेटा वाली संग्रह।

[ 
    { 
     "driverid": "1234", 
     "name": "John Doe" 
    }, 
    { 
     "driverid": "4321", 
     "name": "Jack Smith" 
    }, 
    { 
     "driverid": "3421", 
     "name": "Don Johnson" 
    } 
] 

"मार्ग-सूची" - डेटा सभी पूर्व निर्धारित मार्ग सूचियों वाले संग्रह।

[ 
    { 
     "route_name": "monday_1", 
     "day": "monday", 
     "truck": "21", 
     "stops": [ 
      { 
       "cust_id": "1001" 
      }, 
      { 
       "cust_id": "1010" 
      }, 
      { 
       "cust_id": "1002" 
      } 
     ] 
    }, 
    { 
     "route_name": "friday_1", 
     "day": "friday", 
     "truck": "12", 
     "stops": [ 
      { 
       "cust_id": "1003" 
      }, 
      { 
       "cust_id": "1004" 
      }, 
      { 
       "cust_id": "1012" 
      } 
     ] 
    } 
] 

"मार्गों" - डेटा सभी सक्रिय और पूरा मार्गों के लिए डेटा वाली संग्रह।

प्रत्येक दिन ड्राइवरों एक नया मार्ग शुरू से शुरू:

[ 
    { 
     "routeid": "1", 
     "route_name": "monday1", 
     "start_time": "04:31 AM", 
     "status": "active", 
     "stops": [ 
      { 
       "customerid": "1001", 
       "status": "complete", 
       "start_time": "04:45 AM", 
       "finish_time": "04:48 AM", 
       "elapsed_time": "3" 
      }, 
      { 
       "customerid": "1010", 
       "status": "complete", 
       "start_time": "04:50 AM", 
       "finish_time": "04:52 AM", 
       "elapsed_time": "2" 
      }, 
      { 
       "customerid": "1002", 
       "status": "incomplete", 
       "start_time": "", 
       "finish_time": "", 
       "elapsed_time": "" 
      }, 
      { 
       "customerid": "1005", 
       "status": "incomplete", 
       "start_time": "", 
       "finish_time": "", 
       "elapsed_time": "" 
      } 
     ] 
    } 
] 

यहाँ इस प्रक्रिया इस प्रकार दूर है।एक नया मार्ग ड्राइवरों शुरू करने से पहले करना चाहिए पहला इनपुट डेटा:

  1. driverid
  2. तारीख
  3. ट्रक

एक बार सभी डेटा सही ढंग से दर्ज किया गया है प्रारंभ एक नया मार्ग होगा शुरू करें:

  1. "मार्गों"
  2. क्वेरी संग्रह "मार्ग सूचियों" "दिन" के लिए + "ट्रक" मैच संग्रह में नई वस्तु बना सकते हैं और लौटने "बंद हो जाता है"
  3. सम्मिलित " मार्ग सूचियों मार्गों " संग्रह

के रूप में" में डेटा " "मार्ग" संग्रह के अनुसार चालक अपने दैनिक स्टॉप/कार्यों के साथ आगे बढ़ता है।

सभी कार्यों को पूरा करने पर ड्राइवर के पास "मार्ग" फ़ील्ड को "मार्ग" संग्रह में "पूर्ण" से "सक्रिय" में बदलकर रूट प्रक्रिया को पूरा करने की क्षमता होगी।

यह बताता है कि यह बताता है। कोई प्रतिक्रिया, राय, टिप्पणियां, लिंक, अनुकूलन रणनीति की सराहना की जाती है।

आपके समय के लिए अग्रिम धन्यवाद।

उत्तर

11

आप डेटाबेस स्कीमा मेरे लिए 'क्लासिक' संबंधपरक डेटाबेस स्कीमा के रूप में दिखते हैं। Mongodb डेटा denormaliztion के लिए अच्छा फिट। मुझे लगता है कि जब आप मार्गों को प्रदर्शित करते हैं तो आप सभी संबंधित ग्राहकों, ड्राइवर, ट्रक को लोड करते हैं।

यदि आप अपने सिस्टम को वास्तव में तेज़ी से बनाना चाहते हैं तो आप रूट संग्रह में सबकुछ एम्बेड कर सकते हैं।

तो मैं अपने स्कीमा के निम्नलिखित संशोधनों का सुझाव:

  1. ग्राहकों -
  2. ट्रकों के रूप में है -
  3. ड्राइवर के रूप में-है -
  4. मार्ग-सूची के रूप में-है:

    संदर्भ के बजाय स्टॉप के अंदर ग्राहकों के बारे में डेटा एम्बेड करें। ट्रक भी एम्बेड करें।इस मामले में स्कीमा होगा:

    { 
        "route_name": "monday_1", 
        "day": "monday", 
        "truck": { 
         _id = 1, 
         // here will be all truck data 
        }, 
        "stops": [{ 
         "customer": { 
          _id = 1, 
          //here will be all customer data 
         } 
        }, { 
         "customer": { 
          _id = 2, 
          //here will be all customer data 
         } 
        }] 
    } 
    
  5. मार्गों:

    मार्ग-सूची से और इसके अलावा नए मार्ग प्रतिलिपि रास्ता प्रारंभ ड्राइवर ड्राइवर जानकारी embedd जब:

    { 
        //copy all route-list data (just make new id for the current route and leave reference to routes-list. In this case you will able to sync route with route-list.) 
        "_id": "1", 
        route_list_id: 1, 
        "start_time": "04:31 AM", 
        "status": "active", 
        driver: { 
         //embedd all driver data here 
        }, 
        "stops": [{ 
         "customer": { 
          //all customer data 
         }, 
         "status": "complete", 
         "start_time": "04:45 AM", 
         "finish_time": "04:48 AM", 
         "elapsed_time": "3" 
        }] 
    } 
    

मैं अनुमान लगाएं कि आप खुद से पूछते हैं कि क्या होता है यदि ड्राइवर, ग्राहक या अन्य denormalized डेटा मुख्य संग्रह में बदल गया। हाँ, आपको अन्य संग्रहों के भीतर सभी denormalized डेटा अद्यतन करने की जरूरत है। आपको शायद अरबों दस्तावेजों को अपडेट करने की आवश्यकता होगी (आपके सिस्टम आकार पर निर्भर करता है) और यह ठीक है। यदि आप अधिक समय लगेगा तो आप इसे एसिंक कर सकते हैं।

उपरोक्त डेटा संरचना में कौन से फायदे हैं?

  1. प्रत्येक दस्तावेज़ में आपके डेटा में प्रदर्शित होने के लिए आवश्यक सभी डेटा शामिल हैं। इसलिए, उदाहरण के लिए, आपको डिस्प्ले मार्गों की आवश्यकता होने पर लोड संबंधित ग्राहकों, ड्राइवर, ट्रक की आवश्यकता नहीं है।
  2. आप अपने डेटाबेस को कोई कठिन प्रश्न पूछ सकते हैं। उदाहरण के लिए, अपनी स्कीमा में आप क्वेरी बना सकते हैं जो नाम के साथ ग्राहक के स्टॉप में बंद होने वाले सभी मार्गों को वापस कर देगा: "बिल" (आपको पहले नाम से ग्राहक लोड करना होगा, आईडी प्राप्त करें, और अपनी वर्तमान स्कीमा में ग्राहक आईडी देखें)।

शायद आप खुद से पूछ रहे हैं कि कुछ मामलों में आपका डेटा अनसंक्रनाइज़ किया जा सकता है, लेकिन इसे हल करने के लिए आपको यह सुनिश्चित करने के लिए केवल कुछ यूनिट परीक्षण बनाने की आवश्यकता है कि आप अपना denormolized डेटा सही ढंग से अपडेट करें।

ऊपर आशा है कि आप दस्तावेज़ डेटाबेस बिंदु से, संबंधपरक पक्ष से दुनिया को देखने में मदद करेंगे।

+0

क्या होगा यदि ग्राहक या ट्रक या ड्राइवर जानकारी सिस्टम में अपडेट की गई हो। यह डेटा की अस्पष्टता बनाएगी। बेहतर अन्य मॉडल के केवल आईडी रखें। –

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