2012-02-05 21 views

Respuesta

2

¿Qué tipo de consultas necesitas para apoyar?

La solución más simple es:

@Entity 
public class StoredObject { 
    @Id 
    private Long id; 

    private List<Long> relatedIds; 
} 

entonces, dado un StoredObject, puede llamar objectify.get(StoredObject.class, storedObject.getRelatedIds()) a buscar todos los identificadores relacionados.

Para acelerar algunas consultas en mi propia aplicación, creé unas pocas clases de unión. El gasto se produce en el momento de la escritura (debe mantener las uniones), pero luego el tiempo de lectura es una exploración de índice única con resultados consecutivos.

+0

¿Puede aclarar la forma en que ha implementado sus unirse a clases? Me preocupa la eficiencia si tengo miles de elementos en la lista de IID relacionados, especialmente si necesito recuperar todos los objetos a los que apuntan los ítems relacionados de una vez (lo que puede ser común para mí) – sanity

2

Este no es el mejor enfoque para mapear muchas relaciones en Objectify. La mejor manera es crear una entidad que mapee la relación. Por ejemplo, supongamos que tiene dos objetos A y B, y están asociados de cierta manera. Se podría crear una clase similar a:

Class Link{ 
    Key<?> master; 
    key<?> slave; 

    public Link(){ 

    } 

    public setLink(Entity master, Entity slave){ 
    //initialize 

    } 

} 

entonces es posible crear una entidad de enlace para modelar una relación. Esto mapea automáticamente una a una o muchas a muchas relaciones

1

Pensemos en uno-muchos por un momento; si desea que un objeto A "tener muchos" objeto B, sólo hay dos maneras de hacerlo:

  • la manera relacional: hacer que cada punto B al A. Cuando se tiene el A0 y desea que todos las Bs que se relacionan con ella, solo pregunta por las Bs que apuntan a la A0 dada.

  • Manera NoSQL/ObjectStore: haga que A tenga un campo que contenga una lista de punteros (Llaves) para las B-s. Tenga en cuenta que de esta manera también permite que el B-s para estar en un orden determinado (a pesar de los documentos GAE/Java en sentido contrario.)

cuál es el mejor depende. El modo ObjectStore está limitado por el tamaño de un objeto. La forma relacional está sujeta a un problema sutil en el sentido de que a menos que A y todas las B estén en el mismo Grupo de Entidad y usted haga una Consulta de Antepasado en una Transacción (o tal vez incluso si no está en una Transacción), se le garantiza obtener todos de los Bs que apuntan a A. Sin embargo, si A y B abarcan grupos de entidades, es posible (aunque quizás poco probable) que obtenga una B que no satisfaga el predicado de consulta, o pierda una B que lo haga : https://developers.google.com/appengine/articles/transaction_isolation

En la (ahora estándar) de replicación con alta almacén de datos, la transacción típicamente está completamente aplicado dentro de unos pocos cientos de milisegundos después de la confirmación devoluciones. Sin embargo, incluso si no se aplica por completo , las posteriores lecturas, escrituras y consultas de antecesores reflejarán siempre los resultados de la confirmación, porque estas operaciones aplican cualquier modificaciones pendientes antes de la ejecución.Sin embargo, las consultas que abarcan grupos de entidades múltiples no pueden determinar si hay alguna modificaciones pendientes antes de la ejecución y pueden devolver resultados obsoletos o aplicados parcialmente.

Ahora para muchos: Leí una vez una historia que describía ir al baño en el espacio; había cuatro combinaciones: dentro/fuera de una nave espacial y los dos tipos de ir al baño. Para la última combinación de estar fuera del barco (en un traje espacial) y eliminar sólidos, la única respuesta fue "no hay una manera elegante" (también el título del artículo): http://settlement.arc.nasa.gov/CoEvolutionBook/SPACE.HTML#There No es Graceful Way . .. y esa también es la respuesta a muchas relaciones en GAE. Puede construirlos usando una clase join y cada lado de la unión podría implementarse con una consulta o una lista de Keys.

2

he resuelto utilizando este enfoque con Objectify 4.0:

@Entity 
@Index 
public class Module { 

@Id 
private Long id; 
private String name; 

@Load 
private List<Ref<Template>> templates; 


public List<Template> getTemplates() { 
    List<Template> templates = new ArrayList<Template>(); 

    for (Ref<Template> temp : this.templates) { 
     templates.add(temp.get()); 
    } 

    return templates; 
} 

public void setTemplates(List<Template> templatesParm) { 
    List<Ref<Template>> templates = new ArrayList<Ref<Template>>(); 

    for (Template temp : templatesParm) { 
     templates.add(Ref.create(temp)); 
    } 

    this.templates = templates; 

} 
+0

ya que no hay una consulta similar en Objectify, ¿cómo podríamos obtener una sola plantilla asociada con múltiples módulos? –

Cuestiones relacionadas