2011-06-05 26 views
8

datastore varlıklarının sürüm geçmişini nasıl saklıyorum? A'nın uzun bir kimliği vardır. A alanlarına yapılan tüm değişikliklerin geçmişini tutmak istiyorum. Bu tür bir sürümün varlıklar üzerinde yapılmasının en iyi yöntemleri nelerdir? A'nın alt sınıflarıyla iyi çalışan ve olabildiğince otomatik olan bir çözümü tercih ederim.AppEngine

Teşekkürler!

+2

Java veya Python? Java ise, hangi veri erişim çerçevesini kullanıyorsunuz? –

cevap

0

AppEngine uygulamalarımızdan birine benzer bir şey yapıyoruz. Bulduğumuz tek etkili yöntem, sürümleriniz olan bir B Varlığına sahip olmaktı ve A Varlığı anahtarların listesini tutar.

Ardından, istemcimizin hangi kopyasını aldığını belirlemek için ETN'leri REST hizmetlerimizde kullanırız.

+0

Tüm A'nın en son sürümüne nasıl karşıdan sorgularsınız (özgün örneğimden) – aloo

+0

Sorgu sürelerini önlemek için en son sürüme bağlanan ikinci bir özelliği saklarız. – Devraj

2

Her varlığın iki referansı olan, bir önceki sürümüne ve bir sonraki sürüme sahip olduğu bağlantılı bir varlık listesi oluşturabilirsiniz. Tabii ki bu referansları kendiniz korumalısınız. Bir varlığın en yeni sürümü, bir sonraki sürüme (veya boş/boş bir başvuruya) başvurmaksızın olacaktır.

Kullanım durumunuza bağlı olarak, yalnızca bir varlığın iki sürümü arasındaki farklılıkları depolamanın yollarını incelemek isteyebilirsiniz (değişiklikler küçükse ve varlıklar büyükse).

0

Bunu yapmanın pek çok yolu var.

Veri modelinde daha fazla sınıf gerektirmeyen bir yöntem istiyorsanız, en son sürümü okumak için sürümleri ve ata sorgusunu yazmak için ebeveyn özniteliğini kullanabilirsiniz.

model olabilir:

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

kolu olabilir: Burada

bir bu Python GAE içinde ndb.Model ve webapp2 çerçevesini kullanarak bir wiki sayfasında işe yarayabilir nasıl örneğidir

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() 
İlgili konular