2011-06-05 16 views
8

में डेटास्टोर इकाइयों के संस्करण इतिहास को कैसे बनाए रखें I appengine पर मेरे डेटास्टोर में एक एंटिटी ए संग्रहित कर रहा हूं। ए में एक प्रकार का आईडी लंबा है। मैं ए के खेतों में किए गए सभी बदलावों का इतिहास रखना चाहता हूं। संस्थाओं पर इस प्रकार के संस्करण आईएनजी करने के लिए सबसे अच्छा प्रथा क्या हैं? मैं एक समाधान पसंद करूंगा जो ए के उप-वर्गों के साथ अच्छी तरह से काम करता है और जितना संभव हो सके स्वचालित हो।Appengine

धन्यवाद!

+2

जावा या पायथन? यदि जावा, आप किस डेटा एक्सेस फ्रेमवर्क का उपयोग कर रहे हैं? –

उत्तर

0

हम अपने ऐपइंजिन ऐप्स में से किसी एक के लिए कुछ ऐसा कर रहे हैं। हमने पाया एकमात्र कुशल तरीका था, एक एंटिटी बी है जो आपके संस्करण हैं, और एंटिटी ए कुंजी की एक सूची रखता है।

फिर हम अपने आरईएसटी सेवाओं में ईटीएजी का उपयोग यह पहचानने के लिए करते हैं कि हमारे क्लाइंट की एक प्रति प्राप्त करने के लिए कौन सा संस्करण है।

+0

आप सभी ए के नवीनतम संस्करण (मेरे मूल उदाहरण से) – aloo

+0

के खिलाफ कैसे पूछते हैं हम एक दूसरी संपत्ति रखते हैं जो क्वेरी समय से बचने के लिए सबसे हाल के संस्करण से जुड़ा हुआ है। – Devraj

2

आप इकाइयों की एक लिंक सूची बना सकते हैं, जहां प्रत्येक इकाई के दो संदर्भ होते हैं: एक पिछले संस्करण में से एक और अगले संस्करण में से एक। आपको निश्चित रूप से उन संदर्भों को बनाए रखना होगा। किसी इकाई का नवीनतम संस्करण अगले संस्करण (या खाली/शून्य संदर्भ) के संदर्भ के बिना होगा।

आपके उपयोग के मामले के आधार पर आप किसी इकाई के दो संस्करणों के बीच मतभेदों को स्टोर करने के तरीकों को भी देखना चाहते हैं (यदि परिवर्तन छोटे हैं और संस्थाएं बड़ी हैं)।

0

ऐसा करने के कई तरीके हैं।

यदि आप एक ऐसे तरीके से चाहते हैं जिसके लिए डेटा मॉडल में अधिक कक्षाओं की आवश्यकता न हो, तो आप नवीनतम संस्करण को पढ़ने के लिए संस्करणों और पूर्वजों की क्वेरी लिखने के लिए मूल विशेषता का उपयोग कर सकते हैं।

मॉडल हो सकता है:

class WikiPage(ndb.Model): 
    title = ndb.StringProperty(required = True) 
    text = ndb.TextProperty(required = True) 
    datetime = ndb.DateTimeProperty(auto_add_now = True) 

संभाल हो सकता है:

यह इस तरह एक विकी पेज अजगर GAE में ndb.Model और webapp2 ढांचे का उपयोग करने में काम कर सकता था की एक उदाहरण है

class Page(webapp2.RequestHandler): 
    def get(self, path): 
     # create the page key from the page id (in this case, the get request path) 
     page_key = ndb.Key('WikiPage', path) 

     # query for edited versions 
     wikipage_edited = WikiPage.query(ancestor=page_key).order(-WikiPage.datetime).get() 

     # check if wikipage have edited versions 
     if wikipage_edited: 
      wikipage = wikipage_edited 

     # if not, get the original version 
     else: 
      wikipage = page_key.get() 

     # some custom function to render the wikipage 
     self.render(wikipage) 

    def post(self): 
     # you can pass some parameter that indicates the page_id being edited 
     page_id = self.request.get('page_id') 

     # check if page_id was sent 
     if page_id: 
      wikipage = WikiPage(parent = ndb.Key('WikiPage', page_id), 
           title = self.request.get('new_title'), 
           text = self.request.get('new_text')) 

     # if page_id wasn't sent, it assumes that a new page is being created 
     else: 
      # some custom function that create a page id in the way you want 
      page_id = self.create_a_page_id() 
      wikipage = WikiPage(id = page_id, 
           title = self.request.get('title'), 
           text = self.request.get('text')) 
     wikipage.put()