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 请帮助我理解GAE';s数据存储_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google app engine 请帮助我理解GAE';s数据存储

Google app engine 请帮助我理解GAE';s数据存储,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,GoogleAppEngine数据存储允许每个实体都有一个父实体,本质上是形成实体层次结构的一种方式。例如,员工的地址可以是: Company#521/Department#5/Employee#3 实体id仅在具有相同父实体的实体之间是唯一的,因此需要完整的实体路径来唯一地对其进行寻址 到目前为止,一切顺利 但什么时候我应该以这种方式对父子关系建模,而不是像在传统数据库中那样依赖实体中的基本引用属性 我能想到的唯一原因是避免数据存储查询中缺少连接。我只能使用我正在检索的实体的属性以及实体层次

GoogleAppEngine数据存储允许每个实体都有一个父实体,本质上是形成实体层次结构的一种方式。例如,
员工
的地址可以是:

Company#521/Department#5/Employee#3
实体id仅在具有相同父实体的实体之间是唯一的,因此需要完整的实体路径来唯一地对其进行寻址

到目前为止,一切顺利

但什么时候我应该以这种方式对父子关系建模,而不是像在传统数据库中那样依赖实体中的基本引用属性

我能想到的唯一原因是避免数据存储查询中缺少连接。我只能使用我正在检索的实体的属性以及实体层次结构中任何级别的父实体的属性来过滤查询

使用此功能还有其他原因吗

数据存储文档指出,属于同一层次结构的实体被视为一个实体组,同一实体组中的实体具有序列化写访问权限。这到底是什么意思?这是否意味着如果我的应用程序的一个线程正在更新部门5,另一个正在写入员工3的线程将不得不等待更新完成

谢谢

父功能而非ReferenceProperty的典型用法是for。

Google App Engine只允许在同一个实体上进行交易,即具有相同父级的一组实体。

您应该仅在需要定义交易域时使用实体组。在App Engine上,事务只能修改单个实体组中的实体,即具有相同父级的实体。如果两个实体之间不需要事务完整性,则它们不应位于同一实体组中


如果您绝对需要全局事务,您可以自己实现它们-请参阅示例。实际上,相对较小比例的应用程序实际上需要全球事务。

有趣的问题。期待答案。“谷歌应用程序引擎只允许在同一实体组中的实体上进行交易”——但如果我的应用程序将资金从用户A的银行账户转移到用户B的银行账户,该怎么办?这两个实体不共享父实体,但我确实希望它们在一个事务中@Jen没有什么可以阻止您为不同的银行帐户定义一个通用的父模型。@systempuntoout这是一个糟糕的想法,会立即导致争用问题。因为您可以更新同一实体组中的实体的速率有限制。将所有实体放在同一个组中会限制所有这些实体的更新率,这使得可伸缩性几乎不可能。@Nick谢谢。。那么,你的意思是我们需要避免不同实体之间的交易?我认为这是一个常见的事务用例。我必须阅读您的交易文章:)。