14

संदर्भप्रोपर्टी दो मॉड्यूल के बीच संदर्भों को संभालने में बहुत उपयोगी थी। फॉक्स उदाहरण:डीबी। रेफरेंसप्रोपर्टी() बनाम ndb.KeyProperty ऐप इंजन

class UserProf(db.Model): 
    name = db.StringProperty(required=True) 

class Team(db.Model): 
    manager_name = db.ReferenceProperty(UserProf, collection_name='teams') 
    name = db.StringProperty(required=True) 
  • टीम उदाहरण के साथ 'MANAGER_NAME' प्राप्त करने के लिए, हम team_ins.manager_name का उपयोग करें।
  • विशिष्ट टीम उदाहरण द्वारा प्रबंधित 'टीम' प्राप्त करने के लिए, हम user_instance.teams का उपयोग करते हैं और फिर से चालू होते हैं।

क्या यह आसान और समझ में नहीं आता है? > Ndb.KeyProperty (तरह = UserProf)

  • team_ins -

    NDB का उपयोग कर एक ही बात करने में, हमने

    db.ReferenceProperty (UserProf, COLLECTION_NAME = 'टीमों के) को संशोधित करने के लिए है। manager_name.get() आप प्रबंधक नाम

  • देना सभी टीम जो विशेष उपयोगकर्ता द्वारा चरनी हैं प्राप्त करने के लिए होता है, हम (Team.manager_name == user_ins.key) Team.query में टीम के लिए

    क्या करना है: (स्वरूपण है यहां काम नहीं कर रहा)

    print "team name:", team.name 
    

आप से निपटने इन स्थितियों से इस तरह आसान और NDB से DB में पठनीय लग रहा है देख सकते हैं।

  • एनडीबी में रेफरेंसप्रोपर्टी को हटाने का कारण क्या है?
  • यहां तक ​​कि डीबी की क्वेरी user_instance.teams वही काम कर रही होगी जैसा कि यह एनडीबी के लूप में किया जाता है। लेकिन एनडीबी में, हम स्पष्ट रूप से लूप के लिए उपयोग कर उल्लेख कर रहे हैं।
  • जब हम user_instance.teams करते हैं तो दृश्यों के पीछे क्या हो रहा है?

अग्रिम धन्यवाद ..

उत्तर

26

टिम ने इसे अच्छी तरह से समझाया।हमने पाया कि एक आम एंटी-पैटर्न संदर्भ गुणों का उपयोग कर रहा था और उन्हें एक समय में लोड कर रहा था, क्योंकि नोटेशन "entity.property1.property2" यह स्पष्ट नहीं करता है कि पहला बिंदु डेटाबेस को "प्राप्त" ऑपरेशन का कारण बनता है। इसलिए हमने आपको "entity.property1.get()। Property2" लिखने के लिए मजबूर कर दिया, और हमने केवल "entity.property1.get_async" कहकर बैच प्रीफेचिंग (निक के ब्लॉग से जटिल समाधान के बिना) करना आसान बना दिया।() "इकाइयों के समूह के लिए - यह कतार एक बैच परिणाम के लिए अवरुद्ध किए बिना ऑपरेशन प्राप्त करती है, और जब आप" entity.property1.get()। property2 "का उपयोग करके इन गुणों में से किसी एक का संदर्भ देते हैं तो यह दूसरा नहीं शुरू होगा ऑपरेशन प्राप्त करें, लेकिन उस बैच को पूरा करने की प्रतीक्षा है (और दूसरी बार जब आप ऐसा करते हैं, बैच पहले से ही पूर्ण है)। इस तरह से प्रक्रिया में और memcache एकीकरण मुफ्त में आता है।

+0

धन्यवाद। एनडीबी डीबी के समान है लेकिन यह स्पष्ट है और उपयोगकर्ता को यह पता चल जाएगा कि वहां() ऑपरेशन है। इस मामले में कोई प्रदर्शन सुधार नहीं है। मैंने ndb async के बारे में पढ़ा है, अभी तक इसका उपयोग नहीं किया है। – rajpy

+3

@ टिम और गिडो, क्या आप कृपया http://code.google.com/p/google-app-engine-samples/ में से एक के समान ndb का उपयोग करके लिखे गए नमूना अनुप्रयोगों का सुझाव दे सकते हैं। और एनडीबी आधारित अनुप्रयोगों में पालन करने के लिए भी सर्वोत्तम प्रथाओं। यह बहुत मदद करेगा। धन्यवाद। – rajpy

+0

'entity.keyproperty.get() को कॉल करना। Somevalue1' पहली बार' keyproperty' द्वारा संदर्भित इकाई को 'entity.keyproperty.get() में कुछ प्राप्त करेगा। Somevalue2' और 'entity.keyproperty.get()। Somevalue3' डीबी कॉल नहीं करेगा ??? –

7

मैं क्यों गुइडो संदर्भ संपत्ति को लागू नहीं किया है के रूप में इस सवाल का जवाब पता नहीं है।

हालांकि मैं एक pre_fetch_refprops http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine का उपयोग कर (पूर्व, get_value_for_datastore के साथ सभी चाबियाँ हथियाने द्वारा संदर्भ गुण के सभी को हासिल करेगा) बहुत समय बिताया और फिर इसे कुंजी पर एक get_multi करता पाया।

यह बहुत अधिक कुशल था।

यदि ऑब्जेक्ट संदर्भित ऑब्जेक्ट मौजूद नहीं है तो ऑब्जेक्ट लाने की कोशिश करते समय आपको एक त्रुटि मिलेगी।

यदि आप किसी ऑब्जेक्ट को चुनते हैं जिसमें संदर्भ थे, तो संभवतया आप की योजना बनाई गई थी।

इसलिए मैंने एक मामले को छोड़कर पाया, जहां आपके पास एक इकाई है और आप संदर्भित ऑब्जेक्ट को .name प्रकार एक्सेसर के साथ पकड़ना चाहते हैं, आपको संदर्भित इकाई को लाने से रोकने के लिए सभी तरह के हुप्स के माध्यम से कूदना था।

+0

धन्यवाद। उम्मीद है कि गिडो खुद इस सवाल का जवाब देंगे। :) :) – rajpy

+0

टिम, लिंक के लिए धन्यवाद। एनडीबी में प्रीफेचिंग आसान बना दिया गया है। – rajpy

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