Pregunta

Uno puede implementar varias versiones de la misma aplicación en GAE/J, pero ¿cómo GAE/J lidiar con el hecho de que las diferentes versiones pueden utilizar diferentes Almacén de datos (y posiblemente incompatibles) esquemas?

Ejemplo:

Supongamos que en la versión 1 de mi aplicación tengo un POJO como (que he dejado fuera los varios detalles en aras de la simplicidad):

public class User {

  private String key;

  private String username;

  private Integer phoneNumber;

}

Ahora supongamos que en la versión 2 se desea utilizar:

public class User {

  private String key;

  private String username;

  // on this version, replaced 'phoneNumber' by: 
  private String eMail;

}

Ahora dos preguntas:

  1. Si me implementar ambas versiones om GAE/J, ¿qué esquema voy a ver en el Almacén de datos?

  2. ¿Qué acerca de los datos de la misma?Si puedo agregar un usuario en la versión 2, voy a ver sus datos en el Almacén de datos de la versión 1?

¿Fue útil?

Solución

Citando el docs,

A diferencia de las bases de datos relacionales, la Aplicación Motor de almacén de datos no requiere que todas las entidades de un tipo dado tienen el mismas propiedades.La aplicación puede especificar y aplicar su modelo de datos el uso de las bibliotecas se incluye con el SDK, o su propio código.

Esto también ha sido referido como "suave" esquema -- el almacén de datos que realmente no ¿ los esquemas, pero puede más o menos simular algunas de soft tipo de esquema a través de código de nivel de aplicación (su propio, o en las bibliotecas).

Así que si usted (a través de la biblioteca o en su propio código) aplicar una restricción que dice "este atributo debe estar presente", y una cierta entidad en realidad no tiene ese atributo (porque fue insertado a un "suave" esquema de, por ejemplo, una versión diferente de la aplicación), entonces usted va a obtener lo que la excepción de su código de nivel de aplicación o biblioteca elige utilizar para indicar una violación de esta restricción blanda, en el punto en el que la restricción está activada.

Si usted expresar sin limitaciones, a continuación, un atributo que falta o tendrá un valor predeterminado proporcionado por su código o en la biblioteca, o bien un "default default", que creo que es normalmente null en Java o None en Python.

Tenga en cuenta que las diferentes versiones de la aplicación puede utilizar diferentes tiempos de ejecución (algunos pueden ser Java, y otros pueden ser de Python) y los diferentes tiempos de ejecución se todavía utilizar el mismo almacén de datos, por lo que el Java vs Python distinción no es importante aquí.

En tu ejemplo (no tiene ningún valor predeterminado proporcionado y ninguna afirmación acerca de la obligación de presencia) me sería de esperar que la adición de un usuario de cualquiera de las dos versiones será visible desde el otro, con los atributos que faltan visto como null (pero pueden haber limitaciones que yo no soy consciente de que, en caso de que una excepción debe ser el resultado cuando una biblioteca intenta validar dichas limitaciones y ve que están siendo violados).

En términos generales, yo no me preocuparía acerca de la adición de "opcional" atributos (que puede ser legítimamente falta/null/None, o de forma explícita por defecto en esos casos, por lo que las entidades escrito por la versión anterior todavía están correctamente legible), pero otros tipos de cambios (haciendo una falta o atributo opcional ser obligatorio en cambio, la adición de otras restricciones, etc) pueden requerir una forma de "migración de base de datos" (tal vez a través del Seguro del Conector de Datos) o "nivel de aplicación "hacks" para la compatibilidad de legado" si la migración es simplemente inviable.

La migración puede no ser factible, en particular, si usted requiere la capacidad de reversión de anteriores versiones de la aplicación, por ejemplo (de hecho, en aquellos casos en los que otras operaciones llegar a ser un problema, por ejemplo,la eliminación de restricciones se vuelven tan problemática como la adición de ellos, ya que la versión anterior podría no ser capaz de lidiar con los datos introducidos en la nueva, que viole las restricciones que se han eliminado en la nueva versión).

Así que no es necesariamente un problema simple en la práctica, pero todavía ayuda a pensar de esta manera:el almacén de datos de por sí no tiene ningún esquema, sólo que mi aplicación y/o las bibliotecas que elija para hacer cumplir todas las limitaciones que desee en la aplicación a nivel subyacente entidades que, de por sí, cada uno realmente tiene un conjunto arbitrario de los atributos "blandos" esquema de la aplicación, a nivel de esquema, no "real" esquema de la capa de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top