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