首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Appengine数据存储的层次结构优化

Google Appengine数据存储的层次结构优化
EN

Stack Overflow用户
提问于 2009-06-21 04:55:23
回答 2查看 1.4K关注 0票数 4

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

代码语言:javascript
复制
class ToolCategories(db.Model):  
   name = db.StringProperty()  
   parentKey = db.SelfReferenceProperty(collection_name="parent_category")  
   ...  
   ...  

我想打印保留层次结构的所有类别名称,比如以如下形式打印:

代码语言:javascript
复制
--Information Gathering  
----OS Fingerprinting  
----DNS  
------dnstool  
----Port Scanning   
------windows  
--------nmap  
----DNS3  
----wireless sniffers  
------Windows  
--------Kismet  

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

代码语言:javascript
复制
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天),我不确定从数据存储访问的角度来看,这是否是完成所需工作的最优化方法。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-21 05:00:25

你有一个非常合理的方法!我的主要警告是与GAE关系不大,但与Python有很大关系:不要使用++=从片段构建字符串。相反,您可以创建一个字符串段列表(使用appendextend或list comprehensions &c),在完成所有操作后,您可以使用''.join(thelist)或类似方法将其连接起来,以获得最终的字符串结果。尽管最近的Python版本努力优化++=循环本质上的O(N squared)性能,但最终,您最好是在整个过程中构建字符串列表,并在最后对它们进行''.join

票数 2
EN

Stack Overflow用户

发布于 2009-06-21 12:34:18

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

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

代码语言:javascript
复制
class ToolCategories(db.Model):
  name = db.StringProperty()
  parents = db.ListProperty(db.Key)

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

代码语言:javascript
复制
q = ToolCategories.all().filter('parents =', root_key)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1023234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档