Google App Engine数据存储区中的实体组

时间:2009-10-03 23:27:58

标签: python google-app-engine schemaless

所以我有一个应用程序,如果我诚实并不真正需要事务完整性(许多更新,其中没有一个是关键的)。因此,我计划暂时将实体组留在路边。但我仍然希望了解它(来自关系背景)。

我看到它的方式,我的应用程序的所有查询都将基于用户。因此,根据docs recommendations,我不需要将任何高于用户实体的组分组。但我并没有计划拥有一个特定的用户实体,而是依赖于实体本身的UserProperty。

我看到它的方式,如果我想要交易(基于每个用户),我将需要某种root用户实体作为其数据层次结构的所有实体的父级,无论如何瘦这个实体实际上是,即基本上没有属性。

这是对的吗?

对于冗长的道歉,我只是真正地指出今晚在实践中实际上意味着什么模式......

2 个答案:

答案 0 :(得分:11)

  

我看到它的方式,如果我想要交易(基于每个用户),我将需要某种root用户实体作为其数据层次结构的所有实体的父级,无论如何这个实体实际上很薄,即基本上没有属性。

我不会只创建一个root用户实体并将所有内容都放在其实体组中。想想你需要什么交易。如果您的用户实体上没有任何属性,那么您在使用?

的交易中将使用它

我不知道您的数据,但我们假设它是一个博客系统,您有用户,帖子和评论。 Post模型包含number_of_comments,因此您无需计算它们。您可能希望事务确保在创建注释时,可以安全地更新number_of_comments属性。

在这种情况下,在单个实体组中拥有所有用户帖子和评论将是不必要的开销。相反,您可以将评论发布在与其所属的帖子相同的实体组中。没有必要将帖子与用户放在同一个组中,事实上这是一个坏主意,因为任何用户帖子中发布的评论都会争用写同一个实体组。

我今天在博客上写了short article about entity groups。您可能会发现它很有用。

答案 1 :(得分:3)

你基本上是正确的。如果需要事务功能,则需要对它们进行分组。但是,在数据存储区中的实体意义上,您可以将多个实体组合在一起,而无需创建实际的根实体。您改为创建一种虚拟根实体。此功能的一个重要用例是在创建子对象之前创建子对象的能力。

  

您可以使用。创建实体   没有先创建的祖先路径   父实体。为此,你   使用a为祖先创建一个密钥   种类和密钥名称,然后用它作为   新实体的父母。所有实体   与祖先相同的根源   同一个实体组,无论是否   路径的根代表一个   实际实体。

该引用来自the same doc you linked to