1

当它们没有父实体(它们是根实体)时,为什么相同类型的实体不隐含在同一个实体组中?这是否意味着如果我想做例如将数据从 MySQL 写入 HRD 的批处理操作:

db.put([Person(name=person.name) for person in cursor.execute("SELECT * FROM person")])

出于这个原因,我必须使用事务:

注意:对于某些实体,对 db.put() 或 db.delete() 的批量调用可能会成功,但对于其他实体则不会。如果调用完全成功或完全失败很重要,则必须使用事务,并且所有受影响的实体必须在同一个实体组中。

来源:https ://developers.google.com/appengine/docs/python/datastore/entities#Batch_Operations

我需要创建一个公共根父密钥,它不作为真实实体存在,仅用于交易目的?

parent_key = db.Key.from_path('Human', 'human')
db.put([Person(parent=parent_key, name=person.name) for person in cursor.execute("SELECT * FROM person")])
4

2 回答 2

2

同类实体并不隐含在同一个实体组中,因为它通常会给大多数用例带来糟糕的性能。

虽然不完全准确,但您可以将实体组视为控制分片的一种方式。同一组中的实体存储在物理上非常接近(即在同一服务器上),允许对所有实体进行事务操作,但也限制了该实体组的性能。实体组内的父关系不限于种类,父实体不必与子实体属于同一种类。

大多数时候,实体组将包含各种不同类型的实体,它们在逻辑上属于一起,因为事务往往基于组。例如,一个 Account 可能是一堆 Transactions 的父级,或者一个 BlogPost 可能是一堆 Comments 的父级。

将一个 Kind 的所有实体放在同一个父级下会阻止它们被正确地设置为其他操作的父级,而这些操作确实需要在事务中进行。

在您的情况下,最好不要在事务中运行操作,并有额外的代码来处理失败情况。

于 2013-01-16T03:59:23.850 回答
1

不,kind 和 parent 是密钥的两个不同部分。完整键实际上由应用程序 id(隐式设置)、命名空间 id、父键(根的所有父键)和名称或 id 组成。

如果省略父实体,则实体是实体组的根,并且是该实体组中的唯一实体。

在您的情况下,一批Person实体不会组成一个实体组,而是每个实体Person(从事务的角度来看)都在其自己的实体组中。所以你的批量 put 不会是原子的。

注意:实体组是“让我们将所有这些实体放在同一台机器上”的花哨名称。

注 2:现在有新的跨集团交易,使您能够跨 5 个不同的实体集团进行交易。

于 2013-01-15T23:59:10.387 回答