gpt4 book ai didi

google-app-engine - Google Appengine Datastore 上的层次结构优化

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:55 24 4
gpt4 key购买 nike

我使用如下所示的模型将分层数据存储在数据存储区中:

class ToolCategories(db.Model):  
name = db.StringProperty()
parentKey = db.SelfReferenceProperty(collection_name="parent_category")
...
...

我想打印保留层次结构的所有类别名称,以这样的某种形式说:

--Information Gathering  
----OS Fingerprinting
----DNS
------dnstool
----Port Scanning
------windows
--------nmap
----DNS3
----wireless sniffers
------Windows
--------Kismet

为了完成上述操作,我使用了使用反向引用功能的简单递归:

class GetAllCategories (webapp.RequestHandler) :


def RecurseList(self, object, breaks) :
output = breaks + object.name + "</br>"
for cat in object.parent_category:
output = output + self.RecurseList(cat, breaks + "--")

return output



def get (self) :
output = ""
allCategories = ToolCategories.all().filter(' parentKey = ', None)
for category in allCategories :
output = output + self.RecurseList(category, "--")

self.response.out.write(output)

由于我是 App Engine 编程的新手(自从我开始编写代码以来不到 3 天),我不确定这是否是从数据存储访问的角度来看完成所需工作的最优化方式。

这是最好的方法吗?如果不是,那是什么?

最佳答案

您的方法的主要缺点是因为您使用“邻接列表”方式来表示树,所以您必须为树的每个分支执行一个数据存储区查询。数据存储区查询相当昂贵(每次大约 160 毫秒),因此构建树,尤其是当它很大时,可能会相当昂贵。

还有另一种方法,本质上是数据存储用于表示实体组的方法:不只是存储父键,而是使用 ListProperty 存储整个祖先列表:

class ToolCategories(db.Model):
name = db.StringProperty()
parents = db.ListProperty(db.Key)

然后,为了构建树,您可以在一个查询中检索整个事物:

q = ToolCategories.all().filter('parents =', root_key)

关于google-app-engine - Google Appengine Datastore 上的层次结构优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com