Java 为Google数据存储使用嵌入类或存储外键?

Java 为Google数据存储使用嵌入类或存储外键?,java,google-app-engine,google-cloud-datastore,jdo,Java,Google App Engine,Google Cloud Datastore,Jdo,这是一个关于谷歌数据存储的最佳实践问题。我正在尝试建立对象关系,我看到了两种选择 在父类中直接嵌入带有@Persistent的子类 使用Google Key类并将我自己的外键作为字符串存储在相关类中 第三个选项不可用,JDO join App Engine不支持加入查询:无法使用子实体的属性查询父实体。(您可以查询嵌入式类的属性,因为嵌入式类存储父实体上的属性。请参见定义数据类:嵌入式类。) 我担心使用选项1时,一个简单的搜索查询会返回到许多不需要的数据 示例为Product类和ProductD

这是一个关于谷歌数据存储的最佳实践问题。我正在尝试建立对象关系,我看到了两种选择

  • 在父类中直接嵌入带有@Persistent的子类
  • 使用Google Key类并将我自己的外键作为字符串存储在相关类中
  • 第三个选项不可用,JDO join

    App Engine不支持加入查询:无法使用子实体的属性查询父实体。(您可以查询嵌入式类的属性,因为嵌入式类存储父实体上的属性。请参见定义数据类:嵌入式类。)

    我担心使用选项1时,一个简单的搜索查询会返回到许多不需要的数据

    示例为Product类和ProductDetail类。当客户搜索我的产品时,他们只是根据类别、名称和价格进行搜索。所有的简单信息都在Product类中。在ProductDetail类中,我持有大量描述字符串、图像链接和关键属性列表。因此,在Product类中,我可以嵌入ProductDetail类,或者只创建一个保存ProductDetail类键值的外键属性


    那么我应该使用选项2吗?我在某个地方读到,不要将Google数据存储视为关系数据库。但是在使用选项2时,我正是这么做的。

    同意选项1是不可伸缩的,因为请求者通常对嵌入的子对象不感兴趣。JDO和JPA旨在按需执行数据的延迟加载,但在不需要嵌入数据的情况下,可能仍然存在开销

    选项2可能看起来像是严格的关系,但不一定非得如此。如果您的实体没有通过祖先键锁定到实体组中,则记录是不相关的,没有约束。实际上,您需要确定实体设计和应用程序代码中一致性的紧密性