Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 当XG(跨组)事务可以完成相同的工作时,为什么要选择实体组事务?_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google app engine 当XG(跨组)事务可以完成相同的工作时,为什么要选择实体组事务?

Google app engine 当XG(跨组)事务可以完成相同的工作时,为什么要选择实体组事务?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,在app engine数据存储设计中考虑以下两种情况: A是B的祖先。我们使用事务更新此实体组。 A和B都没有祖先。我们使用一个XG事务来更新这两个实体。 我可以在案例2中看到这些优势: 就像案例1一样,它实现了原子性。 如果我给A和B一个字符串或整数id,假设它们是不同的类型,我可以在找到另一个时查找其中一个。在案例1中,这相当于由家长或孩子查找。 因为实体不在组中,所以它们不受写吞吐量限制。 以上几点正确吗?案例1何时以及为什么要用于案例2?XG事务只能跨25个不同的实体组,因此在一个批次中

在app engine数据存储设计中考虑以下两种情况:

A是B的祖先。我们使用事务更新此实体组。 A和B都没有祖先。我们使用一个XG事务来更新这两个实体。 我可以在案例2中看到这些优势:

就像案例1一样,它实现了原子性。 如果我给A和B一个字符串或整数id,假设它们是不同的类型,我可以在找到另一个时查找其中一个。在案例1中,这相当于由家长或孩子查找。 因为实体不在组中,所以它们不受写吞吐量限制。
以上几点正确吗?案例1何时以及为什么要用于案例2?

XG事务只能跨25个不同的实体组,因此在一个批次中可以进行多个更改的数量是有限制的。此外,使用祖先允许您在祖先组内的数据上构建查询

以一个简单的微博网站为例,用户可以在该网站上发帖并查看其他用户的帖子。你的主页显示了所有用户的最新帖子,因此进行最终一致的查询来获取这些数据是可以的,我们可以容忍一些过时的情况。然而,当用户发布帖子时,他们应该总是看到该帖子显示在他们的提要中

如果您将每个帖子存储在自己的EG中,您对用户帖子的查询可能如下所示:SELECT*FROM post WHERE AUTHER=$current_user。然而,这最终是一致的。因此,用户可能会发表一篇文章,然后不让它显示在他们的提要中。相反,我们可以利用EGs,让每个帖子都成为创建它的用户的子帖子。然后,我们可以使用以下命令查询单个用户的帖子:SELECT*FROM Post,其中_key__有祖先键'user',$current_user


在这种情况下,用户将被限制为每秒创建一篇文章,但是这与自然边界很好地吻合-此时,用户的时间受到键入文章所需时间的限制。

在您的示例中,用户最终将拥有数万篇文章,这使得实体组非常大。这不是问题吗?另外,在我的例子中,A和B共享相同的id,但是不同的类型,这不是很好的一致性吗?如果用户有很多帖子,这没关系。显然,你应该设置一个限制,并使用分页来实际显示它们。对不起,我不是想暗示事务没有强一致性——get和put总是强一致的,不管它们是否在事务中使用。