在数据存储中保持关系 - 应用引擎和客观化

时间:2015-05-31 23:41:50

标签: java google-app-engine google-cloud-datastore objectify

我的应用程序正在使用objectify。我是NoSql的新手。

我有这样的数据模型。不注意缺乏吸气剂和制定者,缺乏建造者模式等只是一个例子。

如您所见,ReallyWeirdCar是一个非常深的对象图的根。

现在,假设我使用给定的方法在内存中完全构建了一个ReallyWeirdCar对象。

另外,假设数据存储区完全为空。

如何使用客观化保存该对象?

是ofy()。save()。entity(rwc1)足以一次性保存整个对象图吗?

我如何坚持这样的关系?

另外,如果大部分时间我都在执行“查找客户约翰所要求的所有汽车”这样的查询,您会认为这是一个“好”(高性能)模型吗?

事先提前

    @Entity
    class ReallyWeirdCar {

    @Id
    public String id;

    public String name;

    @Load
    public Ref<Engine> e1;

    @Load
    public Ref<Engine> e2;

    // a reference to the customer who solicited the construction of this car
    @Index
    @Load
    public Ref<Customer> customer;

}

    @Entity      
    class Customer {

    @Id
    public String id;

    public String name;
}

@Entity
class Engine {

    @Id
    public String id;

    public String name;

    @Load
    public Ref<List<Carburetor>> ecs;

}

@Entity
class Carburetor {

    @Id
    public String id;

    public String name;

    @Load
    public Ref<Manufacturer> manufacturer;

}

@Entity
class Manufacturer {

    @Id
    public String id;

    public String name;

}




 // inside some service 
 public buildAndPersistCar() { 

    Customer cust1 = new Customer("cust1", "customer1"); 

    Manufacturer m1 = new Manufacturer("m1", "manufacturer1");

    Carburetor c1 = new Carburetor("carb1", "carburetor1", m1);
    Carburetor c2 = new Carburetor("carb2", "carburetor2", m1);
    Carburetor c3 = new Carburetor("carb3", "carburetor3", m1); 
    Carburetor c4 = new Carburetor("carb4", "carburetor4", m1); 

    Engine e1 = new Engine("e1", "engine1", Arrays.asList(c1,c2)); 
    Engine e2 = new Engine("e2", "engine2", Arrays.asList(c3,c4)));

    ReallyWeirdCar rwc1 = new ReallyWeirdCar("rwc1", "reallyweirdcar1", e1, e2, cust1);     

    // what do i do here ???? 
    // how do i persist rwc1 ???



}

1 个答案:

答案 0 :(得分:1)

没有&#34;级联保存的概念&#34;在Objectify。如果要保存N个实体,则必须明确保存它们。 您节省的是您节省的资金

从性能角度来看,这看起来并不理想。 GAE数据存储区喜欢更粗的粗粒度实体;您的示例需要四轮抓取才能到达制造商。如果这是一个真正准确的模型,那么你可能希望忍受它;四轮抓取不会杀死你,特别是大部分实体都在memcache中。但是,如果你可以对模型进行非规范化(比如在引擎中嵌入化油器),你可以加快它的速度。

这与您在关系数据库中遇到的问题完全相同(规范化或非规范化)。 Objectify实际上更容易,因为Objectify很聪明,并且#34;轮次&#34;批量提取;您将获得四个API调用,而不是~N ^ 4 API调用。但是加载一个装满数千个组件的整个引擎仍然会很痛苦。