2011-06-05 14 views
8

Estoy almacenando una entidad A en mi almacén de datos en appengine. A tiene una identificación de tipo Long. Me gustaría mantener un historial de todos los cambios realizados en los campos de A. ¿Cuáles son las mejores prácticas para hacer este tipo de versión ing en las entidades? Preferiría una solución que funcione bien con las subclases de A y sea lo más automática posible.Cómo mantener el historial de versiones de las entidades del almacén de datos en Appengine

Gracias!

+2

¿Java o Python? Si es Java, ¿qué marco de acceso a datos está usando? –

Respuesta

0

Estamos haciendo algo similar para una de nuestras aplicaciones de App Engine. La única forma eficiente que encontramos fue tener una Entidad B que son sus versiones, y la Entidad A mantiene una lista de claves.

Luego utilizamos ETags en nuestros servicios REST para identificar de qué versión obtiene copia nuestro cliente.

+0

cómo consultar con la versión más reciente de todas las A (de mi ejemplo original) – aloo

+0

Conservamos una segunda propiedad que enlaza con la versión más reciente para evitar tiempos de consulta. – Devraj

2

Puede crear una lista vinculada de entidades, donde cada entidad tiene dos referencias: una a su versión anterior y una a la siguiente. Usted debe mantener esas referencias usted mismo, por supuesto. La versión más reciente de una entidad será la que no haga referencia a una próxima versión (o una referencia vacía/nula).

Dependiendo de su caso de uso, es posible que también desee buscar formas de almacenar solo las diferencias entre dos versiones de una entidad (si los cambios son pequeños y las entidades son grandes).

0

Hay muchas maneras de hacerlo.

Si desea una forma que no requiera más clases en el modelo de datos, puede usar el atributo primario para escribir las versiones y la consulta de antecesores con el fin de leer la última versión.

Aquí está un ejemplo de cómo esto podría funcionar en una página wiki usando ndb.Model y el marco webapp2 en Python GAE:

El modelo podría ser:

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

El mango podría ser:

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() 
Cuestiones relacionadas