2010-09-01 17 views
5

मैं google-app-engine और google datastore (bigtable) में नया हूं और मुझे कुछ संदेह हैं जिसके लिए आवश्यक डेटा मॉडल को डिज़ाइन करने का सबसे अच्छा तरीका हो सकता है।मॉडलिंग पदानुक्रमित डेटा - GAE

मैं एक पदानुक्रम मॉडल, एक उत्पाद सूची की तरह कुछ बनाने की आवश्यकता, प्रत्येक डोमेन गहरे में कुछ उप डोमेन है। फिलहाल उत्पादों की संरचना पढ़ने की आवश्यकताओं से कम बदलती है। शराब उदाहरण:

  • ओरिजिन (Toscana, Priorat, Alsacian)
  • वाइनरी (संबंध रखता है केवल एक उत्पत्ति के लिए)
  • शराब (केवल एक वाइनरी से संबंध रखता है)

सभी संबंधों संबंध तोड़ना हैं और अपूर्ण।

  • पूर्वज प्रबंधन: इसके अतिरिक्त आवश्यकताओं के क्रम में शायद हम लगता है विभिन्न संभावित समाधानों वहाँ हो (लेन-देन की आवश्यकता हो सकती)

    हर शराब के लिए उपयोग की काउंटरों स्टोर करने के लिए दस्तावेज के आदेश में की जरूरत है। अभिभावक संबंधों और लेनदेन का उपयोग

  • छद्म-पूर्ववर्ती प्रबंधन। एक डीबी के साथ पूर्वजों को सिमुलेट करना। लिस्टप्रोपर्टी (डीबी.के)
  • संदर्भप्रोपर्टी। explicitelly कक्षाएं

लेकिन उम्मीद अनुरोधों का आदेश मदिरा, मूल के आधार पर, विभिन्न प्रकार से प्राप्त करने के लिए ... कभी कभी कभी कभी कभी कभी वाइनरी द्वारा में के बीच संबंध को निर्दिष्ट करना ... मैं प्रश्नों के व्यवहार के बारे में चिंतित हूँ इन संरचनाओं का उपयोग करना (जैसे कि एक रिलेशनल मॉडल में एकाधिक शामिल होते हैं। यदि आप किसी परिवार के उत्पादों के लिए पूछते हैं ... आपको उत्पादों के पेड़ में अंतिम गहरे क्वालीफायर के लिए शामिल होने और परिवार के बाद शामिल होने की आवश्यकता है)

शायद कुछ डुप्लीकेट जानकारी बनाने के लिए बेहतर है (Google टीम की सिफारिशों के क्रम में: संचालन महंगा है, लेकिन भंडारण नहीं है, इसलिए डुप्लिकेट सामग्री को मुख्य समस्या नहीं देखी जानी चाहिए)

अन्य इसी तरह के सवालों के कुछ प्रतिक्रियाओं का सुझाव:

  • स्टोर सभी पैरेंट आईडी एक स्ट्रिंग में एक पदानुक्रम के रूप ...
  • एक रास्ता संपत्ति की तरह पी इकाई के बीच संबंधों को डुप्लिकेट एक सब में माता-पिता पेड़ ...

कोई सुझाव?


हाय विल,

हमारे मामले अधिक एक सख्त पदानुक्रमित दृष्टिकोण के रूप में आप दूसरे उदाहरण में प्रतिनिधित्व है। और प्रश्न उत्पादों की सूची को पुनर्प्राप्त करने के लिए है, केवल एक प्राप्त करना सामान्य नहीं है।

हम एक उत्पत्ति से सभी मदिरा, एक वाइनरी से या एक किस्म से पुनः प्राप्त करने की जरूरत है

एक ही रास्ता (यदि हम supose कि विविधता सख्त श्रेणीबद्ध पेड़ का एक और नोड है, केवल एक उदाहरण है) कर सकते थे एक रास्ता संपत्ति में शामिल हो, के रूप में आपका उल्लेख किया:

  • /मूल/{आईडी}/वाइनरी/{आईडी}/विविधता/{आईडी}

मुझ से वाइन की एक सूची प्राप्त करने की अनुमति देने के इस तरह की एक क्वेरी लागू करने वाली विविधता:

wines_query = Wine.all() 
wines_query.filter('key_name >','/origin/toscana/winery/latoscana/variety/merlot/') 
wines_query.filter('key_name <','/origin/toscana/winery/latoscana/variety/merlot/zzzzzzzz') 

या एक उत्पत्ति से इस तरह:

wines_query = Wine.all() 
wines_query.filter('key_name >','/origin/toscana/') 
wines_query.filter('key_name <','/origin/toscana/zzzzzz') 

धन्यवाद!

+0

मुझे आपके अपडेट किए गए प्रश्न को समझ में नहीं आया है। पदानुक्रम में 'विविधता' कैसे फिट होगा? अलग-अलग उत्पत्ति और/या वाइनरी से वाइन नहीं होगा? यदि ऐसा है, तो मुझे लगता है कि विविधता को केवल 'वाइन' मॉडल पर एक संपत्ति होना होगा। मैं यह भी नहीं समझता कि आपके प्रश्न क्या पूरा कर रहे हैं कि मेरे अपने उदाहरण प्रश्न नहीं थे। –

उत्तर

1

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

उदाहरण के लिए, एक विशेष मूल से सभी वाइन पाने के लिए:

origin_key = db.Key.from_path('Origin', 123) 
wines_query = db.Query(Wine).ancestor(origin_key) 

या किसी विशेष वाइनरी से सभी वाइन पाने के लिए: यह सोचते हैं आप के रूप में विभिन्न प्रकार के भंडारण कर रहे हैं

origin_key = db.Key.from_path('Origin', 123) 
winery_key = db.Key.from_path('Winery', 456, parent=origin_key) 
wines_query = db.Query(Wine).ancestor(winery_key) 

और, शराब मॉडल पर एक संपत्ति, किसी विशेष किस्म की सभी वाइन

wines_query = Wine.all().filter('variety =', 'merlot') 

ऑन ई इस सख्त पदानुक्रमित दृष्टिकोण के संभावित नकारात्मक पक्ष की तरह यूआरएल योजना है जो इसे आपके ऊपर लगा सकती है। एक पदानुक्रम लग रहा है कि

तरह
Origin -> Winery -> Wine 

आप कि शराब को पुनः प्राप्त करने के लिए एक महत्वपूर्ण बनाने के लिए कुंजी का नाम या एक शराब की उत्पत्ति और वाइनरी की आईडी पता होना चाहिए के साथ। जब तक आप पहले से ही शराब की कुंजी के स्ट्रिंग का प्रतिनिधित्व नहीं कर लेते हैं। यह मूल रूप से मजबूर करता आप निम्नलिखित तरीकों में से एक में मदिरा के लिए यूआरएल के लिए:

  • /origin/{id}/winery/{id}/wine/{id}
  • /wine/{opaque and unfriendly datastore key as a string}

(निश्चित रूप से पहले यूआरएल क्वेरी स्ट्रिंग पैरामीटर के साथ बदल दिया जा सकता है, महत्वपूर्ण हिस्सा है कि आपको किसी दिए गए शराब की पहचान करने के लिए जानकारी के तीन अलग-अलग टुकड़ों की आवश्यकता है।)

शायद इन यूआरएल योजनाओं के अन्य विकल्प हैं जो मेरे साथ नहीं हुए हैं, हालांकि।

+0

धन्यवाद, मैंने आपके उत्तर के क्रम में प्रश्न अपडेट किया था। –

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