成为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来检索数据实体)。
我想知道我是否应该以不同的方式处理它 - 因为我对数据存储/客观化并没有太多的了解。
答案 0 :(得分:3)
这个问题固有的重要概念误解:关系并不强烈或最终是一致的。查询是。
如果执行按键操作,结果将非常一致。如果执行非祖先过滤器查询,结果将最终一致。改述这个:
如果使用按键操作导航对象图,则会看到强一致性。如果使用非祖先查询过滤器导航对象图,您将看到最终的一致性。
如果您需要强大的一致性,请构建数据,以便通过按键操作或祖先查询来满足您的查询。
答案 1 :(得分:1)
你的逻辑看似合理......但对于关系数据库。
这种逻辑在数据存储区的HRD中不成立。显然有很多方法可以解决这个问题,你已经按照你描述的方式解决了问题。
为了保持一致性,您唯一的机会是使用祖先查询。数据存储最终是一致的,只有“get_by_key”或祖先查询才能“强制”一致性。
如果你想要更接近SQL的东西,可以考虑使用云GQL吗?