【问题标题】:App Engine Data store understanding no SqlApp Engine Datastore 理解 noSql
【发布时间】:2013-03-20 19:38:53
【问题描述】:

我有这两个数据存储:

class User(db.Model):
    name = db.StringProperty(required = True)
    password = db.StringProperty(required = True)
    email = db.EmailProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)
    image = db.LinkProperty(required = True)

class Post(db.Model):
    post = db.StringProperty(required = True, multiline = True)
    submitter = db.IntegerProperty(required = True)
    receiver = db.IntegerProperty(required = True)
    created = db.DateTimeProperty(auto_now_add = True)

但是问题是我生成了一个用户页面,其中显示了用户收到的所有帖子,但我以非常 SQL 和幼稚的方式执行此操作,如下所示:

ret = []
    #Get all Posts
    for p in self.getPosts():
        #If the receiver of the post is equal to uId
        if str(p.receiver) == str(uId):

            #Get submitter Details
            sDetails = self.getUserDetails(p.submitter)

            #Check that details were received
            if sDetails:
                #Add needed Details to post
                p.sName = sDetails.name
                p.sId = str(sDetails.key().id())
                p.sImage = sDetails.image

                ret.append(p)
    return ret

你们会如何改进呢?在这种方法中我最讨厌的事情是必须遍历每个帖子,这将导致系统变大后系统变得非常慢。

另外请注意,所有帖子都存储在 memcache 中,因此我无法使用 GQL 来改善这一点。除非您有更好的想法将内容存储在 memcache 中,而不是我的方法...也就是说,将所有常用查询放入其中,并在向数据存储添加新项目后更新缓存。

对于那些可能关注我的问题的人来说,这个项目是社交媒体的一个新概念,一旦完成就会发布一个链接:)

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    您不必每次都从数据库中获取所有帖子;使用过滤查询来获取与特定用户 ID 匹配的所有帖子:

    q = db.Query(Post)
    q.filter('receiver =', uId)
    

    如果您目前无法这样做,因为您将每篇文章都存储在一个 memcache 键下,也许您应该调整您的方法 - 它可能无法很好地扩展。使用上述查询,您可以利用 GAE 数据存储的索引和查询功能,该功能始终优于直接迭代应用程序中的整个实体集。

    我建议您在从数据存储区生成用户页面之后将它们存储在内存缓存中。

    此外,在Post 上,您可以将db.ReferenceProperty 用于submitterreceiver

    class Post(db.Model):
    post = db.StringProperty(required = True, multiline = True)
    submitter = db.ReferenceProperty(reference_class=User, required = True)
    receiver = db.ReferenceProperty(reference_class=User, required = True)
    created = db.DateTimeProperty(auto_now_add = True)
    

    https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses#ReferenceProperty

    【讨论】:

    • 嗯,很有趣。我非常喜欢这种方法!我唯一有点怀疑的是;创建新帖子时,我应该在 referenceProperty 中放入什么类型的数据?只是一个带有用户 id 的 int 还是整个用户对象?
    • @DylanGrech 整个用户对象。
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2013-10-06
    • 2012-07-09
    • 2015-10-08
    相关资源
    最近更新 更多