GAE数据存储区外键和连接

时间:2015-06-22 13:42:44

标签: google-app-engine jpa one-to-many cascade jointable

我正在为一件看起来非常简单的事情而奋斗。 让我解释。 我有一个关于一个人的数据表,我决定使用电子邮件作为id

@Entity
public class Person{
@Id
@Column(name = "email")
String email;
...

我想要完成的是

  1. 创建一个包含两列的表,两列都包含来自Person的电子邮件,含义为#34;第1列中的电子邮件已写入第2列和第34列中的电子邮件;
  2. 当我从Person中删除一行时,我希望第1列中包含此Person电子邮件的第1列中的所有行都将作为级联效果删除
  3. 我想查询我的数据库,以便在给定电子邮件地址的情况下,我将能够在第1点加入表格中的所有行,并提取给定人员的所有数据(姓名,电话...)电子邮件已写入。
  4. 麻烦的是,显然在gae中我不能使用join,而我根本无法理解如何创建具有级联效果的连接表。 欢迎任何帮助。 提前谢谢

1 个答案:

答案 0 :(得分:0)

数据存储区不是关系数据库,因此在开始设计解决方案之前,您应该familiarise yourself使用这些概念。你要做的是将一个方形钉子放入圆孔中:你不仅会发现你缺少连接,你​​还必须实现自己的级联删除(提示:你可能不想这样做)这个,但是如果你这样做,并且你有很多数据,请看Task Queues)。

你没有提供太多的代码,我不知道JPA(提示:看Objectify,它更适合非关系数据存储)但你可能想要类似的东西这个(使用 Objectify 注释):

@Entity
public class Person {
    @Id
    String email;
    ...
}

然后我假设您将拥有某种Message实体(您将其称为两列表):

@Entity
public class Message {
    @Id
    Long msgId;
    @Index
    Ref<Person> from;
    @Index
    Ref<Person> to;
    ...
}

根据您需要执行的查询,您可能需要创建自定义索引(阅读here)。请记住,对数据存储区的查询是索引扫描。

但是,比如说,您想要从Person A发送到Person B的邮件,您可以执行以下操作:

Person a = ofy().load().type(Person.class).id("a@example.com").now();
Person b = ofy().load().type(Person.class).id("b@example.com").now();
...
ofy().load().type(Person.class).filter("from =", Ref.create(a)).filter("to =", Ref.create(b)).list();

您可以使用代表电子邮件的字符串,而不是使用Ref<Person>(基本上是Key)。您可能也不想将email用作@Id,因为这会阻止用户更改其电子邮件地址。