Objectify中的多对多关系具有很强的一致性

时间:2014-09-18 15:22:50

标签: java google-app-engine many-to-many objectify consistency

成为Google Cloud Datoreore的新用户我想确保自己走上正轨。

我需要什么:

  • 多对多关系
  • 关系本身必须保存描述关系的数据
  • 两种方式都需要强一致性:
    • 从用户实体到该用户有权使用的所有数据实体
    • 从数据实体到拥有权限的所有用户

这就是我提出的:

@Entity
public class User {
    @Id String userId;
}

@Entity
public class PermissionIndex {
    @Id long id;
    @Parent Key<User> user;
    List<Ref<Permission>> permissions;
}

@Entity
public class Permission {
    @Id long id;
    boolean writePermission;
    boolean managePermission;
    @Load Ref<Data> data; //So that Data entities can be retrieved with strong
                          //consistency after looking up Permission entities
                          //for a specific User entity
    @Load Ref<User> user; //So that User entities can be retrieved with strong
                          //consistency after looking up Permission entities
                          //for a specific Data entity
}

@Entity 
public class DataIndex {
    @Id long id;
    @Parent Key<Data> data;
    List<Ref<Permission>> permissions;
}

@Enti.
public class Data {
    @Id String dataId;
    @Id String actualData;
}

如果我理解这个实现是正确的,过滤特定用户的数据实体的唯一方法是获取所有Permission实体并在内存中过滤数据实体,我是对的吗?

有没有更好的方法来实现它仍然满足要求?

更新

在我的理解中,这个实现将允许我实现将检索数据的逻辑,确保强一致性(具有用户id - 祖先查询以检索所有Permission实体,然后使用get_by_key来检索数据实体)。

我想知道我是否应该以不同的方式处理它 - 因为我对数据存储/客观化并没有太多的了解。

2 个答案:

答案 0 :(得分:3)

这个问题固有的重要概念误解:关系并不强烈或最终是一致的。查询是。

如果执行按键操作,结果将非常一致。如果执行非祖先过滤器查询,结果将最终一致。改述这个:

如果使用按键操作导航对象图,则会看到强一致性。如果使用非祖先查询过滤器导航对象图,您将看到最终的一致性。

如果您需要强大的一致性,请构建数据,以便通过按键操作或祖先查询来满足您的查询。

答案 1 :(得分:1)

你的逻辑看似合理......但对于关系数据库。

这种逻辑在数据存储区的HRD中不成立。显然有很多方法可以解决这个问题,你已经按照你描述的方式解决了问题。

为了保持一致性,您唯一的机会是使用祖先查询。数据存储最终是一致的,只有“get_by_key”或祖先查询才能“强制”一致性。

如果你想要更接近SQL的东西,可以考虑使用云GQL吗?