Google App Engine Datastore中的实体组

7 投票
2 回答
2842 浏览
提问于 2025-04-15 14:47

我有一个应用,老实说,它并不需要事务完整性(更新很多,但都不是关键的)。所以我打算暂时不考虑实体组的事情。不过,我还是想了解一下这个概念,因为我之前是做关系型数据库的。

在我看来,我的应用所有的查询都是基于用户的。因此,根据文档的建议,我不需要把实体分组到比用户更高的层级。但我并不打算有一个特定的用户实体,而是依赖于实体内部的UserProperty。

我觉得,如果我想要在每个用户的基础上进行事务处理,我需要有一个根用户实体,作为所有属于这个用户数据层级的实体的父级,不管这个实体有多简单,比如说几乎没有属性。

这样理解对吗?

抱歉说得有点多,我今晚才真正明白无模式(schema-less)在实际中意味着什么……

2 个回答

12

我认为,如果我想要进行用户级别的事务处理,我需要一个根用户实体,作为所有数据实体的父级。无论这个实体有多简单,基本上可以说几乎没有属性。

我不会仅仅创建一个根用户实体,然后把所有东西都放在这个实体组里。你要考虑一下你需要事务处理的目的。如果你的用户实体没有任何属性,那你在事务中用它有什么意义呢?

我不知道你的数据具体是什么,但假设这是一个博客系统,你有用户、帖子和评论。帖子模型中有一个属性叫做 number_of_comments,这样你就不需要每次都去计算评论数量。你可能希望通过事务来确保在创建评论时,number_of_comments 这个属性能够安全地更新。

在这种情况下,把所有用户的帖子和评论放在一个实体组里其实是多余的。相反,你可以把评论放在与它们所属的帖子相同的实体组中。没有必要把帖子放到与用户相同的组里,实际上这样做是个坏主意,因为在用户的任何帖子下发布的评论都会争抢写入同一个实体组。

我今天在我的博客上写了一篇关于实体组的简短文章,你可能会觉得有用。

3

你说得基本没错。如果你想要事务处理的能力,就需要把它们分组。不过,你可以把几个实体放在一起,而不需要在数据存储中真正创建一个根实体。你可以创建一个类似虚拟根实体的东西。这个功能的一个重要用处是,你可以在创建父对象之前先创建子对象。

你可以在没有先创建父实体的情况下,创建一个带有祖先路径的实体。要做到这一点,你需要先为祖先创建一个键,使用一种类型和键名,然后把它作为新实体的父级。所有拥有相同根祖先的实体都属于同一个实体组,无论路径的根是否代表一个实际的实体。

这段话来自于你提到的同一份文档

撰写回答