【发布时间】:2013-10-18 14:28:01
【问题描述】:
我正在尝试在 NDB 中存储层次结构,但我很困惑在构造新实体的键时是否应该只使用“父”参数,还是应该在我的模型中包含一个额外的属性来保存父级钥匙?
【问题讨论】:
我正在尝试在 NDB 中存储层次结构,但我很困惑在构造新实体的键时是否应该只使用“父”参数,还是应该在我的模型中包含一个额外的属性来保存父级钥匙?
【问题讨论】:
如果您在键中使用祖先,您将创建一个大实体组(假设树/层次结构的单个根),从写入性能的角度来看,这实际上可能不是您想要的。此外,深层层次结构可能意味着非常大的键。
如果您想使用祖先键移动节点,则必须删除并重新创建整个子键层次结构,其中将父节点存储在节点中(或子键存储在父节点中)意味着您只需存储不同的键在属性中。
如果您通常沿着层次结构向下走(例如 url 遍历),您可能会发现将子键存储在父级的列表中更有效,假设每个级别不会有太多直接子级,以及将父密钥存储在子密钥中。
在决定走哪条路之前,我会详细检查您的实际要求。
【讨论】:
前者。您不需要创建额外的属性,因为它已经为您存储在表示模型路径(实际上是键)的祖先链中。
阅读此链接:https://developers.google.com/appengine/docs/python/datastore/entities#Python_Ancestor_paths
标识实体的完整密钥由一系列种类标识符对组成,指定其祖先路径并以实体本身的路径终止:
[Person:GreatGrandpa, Person:Grandpa, Person:Dad, Person:Me]
要指定实体的父级,请使用模型的 parent 参数 创建子实体时的类构造函数。这个的价值 参数可以是父实体本身或其键;你可以得到 通过调用父实体的 key() 方法来获取密钥。
【讨论】: