我有这两个数据存储:
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中存储东西,而不是我的方法......也就是说,在那里查看所有经常使用的查询并在添加到数据存储区的新项目后更新缓存。
对于那些可能关注我的问题的人来说,这个项目是社交媒体的一个新概念,一旦完成就会发布一个链接:)
答案 0 :(得分:2)
您无需每次都从数据库中获取所有帖子;使用过滤器查询来获取与特定用户ID匹配的所有帖子:
q = db.Query(Post)
q.filter('receiver =', uId)
如果你现在不能这样做,因为你将每个帖子存储在一个memcache密钥下,也许你应该调整你的方法 - 它可能不会很好地扩展。使用上述查询,您可以利用GAE数据存储区的索引和查询功能,这些功能将始终优于直接遍历应用程序中的整个实体集。
我建议在从数据存储区生成用户页面后,将用户页面存储在memcache 中。
此外,在Post
上,您可以db.ReferenceProperty
使用submitter
和receiver
:
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)