java - 数据存储中的持久关系 - App Engine 和 objectify

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

我的应用程序正在使用 objectify。我对 NoSql 真的很陌生。

我有一个这样的数据模型。不注意缺少 getter 和 setter、缺少构建器模式等只是一个例子。

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

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

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

如何使用 objectify 保存该对象?

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 ???



}

最佳答案

Objectify 中没有“级联保存”的概念。如果要保存 N 个实体,则必须显式保存它们。 您节省的就是您节省的

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

这与您在关系数据库中遇到的问题完全相同(规范化或非规范化)。实际上,使用 Objectify 更容易,因为 Objectify 对于批量获取的“轮次”非常智能;您将收到四个 API 调用,而不是 ~N^4 个 API 调用。但加载一个充满数千个组件的整个引擎仍然会很痛苦。

关于java - 数据存储中的持久关系 - App Engine 和 objectify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30563855/

相关文章:

java - TestNG 报告 - 在订单中发布测试

java - 如何在java中动态创建列表而不重复?

python - 在 Python 上的 Google App Engine 中按实体键名过滤

python - 可以在不同的实体类型中使用重复的数据存储 key_name,并且 get_or_insert()

java - 从web逻辑服务器迁移到tomcat服务器时MessageDispatcher为NULL

java - 为什么 Spring DependsOn 注释不能用于自动连接接口(interface)

google-app-engine - 未找到 Google 云打印 OAuth 范围

google-app-engine - Google App Engine NDB Datastore get_by_id 获取实体

ruby-on-rails - 哪种 Web 开发框架最适合 Google App Engine?

javascript - Node.js 中的 Google datastore.lookup 没有返回结果