如何在 appengine 中为追随者流建模?
Posted
技术标签:
【中文标题】如何在 appengine 中为追随者流建模?【英文标题】:how to model a follower stream in appengine? 【发布时间】:2010-05-24 15:59:37 【问题描述】:我正在尝试设计表格来建立追随者关系。
假设我有一个包含用户、主题标签和其他文本的 140char 记录流。
用户关注其他用户,也可以关注主题标签。
我在下面概述了我的设计方式,但我的设计有两个限制。我想知道其他人是否有更聪明的方法来实现相同的目标。
这个问题是
-
为每条记录复制关注者列表
如果添加或删除了一个新的追随者,则“全部”
记录必须更新。
代码
class HashtagFollowers(db.Model):
"""
This table contains the followers for each hashtag
"""
hashtag = db.StringProperty()
followers = db.StringListProperty()
class UserFollowers(db.Model):
"""
This table contains the followers for each user
"""
username = db.StringProperty()
followers = db.StringListProperty()
class stream(db.Model):
"""
This table contains the data stream
"""
username = db.StringProperty()
hashtag = db.StringProperty()
text = db.TextProperty()
def save(self):
"""
On each save all the followers for each hashtag and user
are added into a another table with this record as the parent
"""
super(stream, self).save()
hfs = HashtagFollowers.all().filter("hashtag =", self.hashtag).fetch(10)
for hf in hfs:
sh = streamHashtags(parent=self, followers=hf.followers)
sh.save()
ufs = UserFollowers.all().filter("username =", self.username).fetch(10)
for uf in ufs:
uh = streamUsers(parent=self, followers=uf.followers)
uh.save()
class streamHashtags(db.Model):
"""
The stream record is the parent of this record
"""
followers = db.StringListProperty()
class streamUsers(db.Model):
"""
The stream record is the parent of this record
"""
followers = db.StringListProperty()
Now, to get the stream of followed hastags
indexes = db.GqlQuery("""SELECT __key__ from streamHashtags where followers = 'myusername'""")
keys = [k,parent() for k in indexes[offset:numresults]]
return db.get(keys)
有没有更聪明的方法来做到这一点?
【问题讨论】:
复制***.com/questions/2668470/… 【参考方案1】:您要解决的问题称为扇出问题。
来自 Google App Engine 团队的 Brett Slatkin 就 App Engine 上的扇出问题提供了一种高效/可扩展的解决方案。您可以在此处找到演讲视频:
http://code.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html
【讨论】:
【参考方案2】:是的,正如其他人所指出的,这是扇出问题,感兴趣的人应该看看 Brett Slatkin 的演讲。
但是,我提出了 2 个具体限制,即
为每条记录复制关注者列表正如他们所说,这不是错误,而是一项功能。事实上,appengine 上的扇出就是通过这种方式扩展的。
如果添加或删除了新的关注者,则必须更新“所有”记录。要么不做,要么什么都不做,所以以后的记录不会被遵循。换句话说,一个人不只是跟随人们的潮流,而是在给定的时间跟随人们的潮流。因此,如果您在第 2 天取消关注,您的关注者流仍将显示来自第 1 天的用户记录,但不会显示第 2 天及以后的用户记录。 [注:这与twitter的做法不同]
【讨论】:
【参考方案3】:您可以使用reference 属性,然后有一个包含关注者的公用表,您可以引用该表
【讨论】:
【参考方案4】:我不确定如何在 Google App-Engine 中执行此操作,但我会考虑的一种数据库架构是:
表: 用户 -- 带有属性的用户表 HashTag -- 带有属性的 HashTag 表 Follows -- 定义谁跟随谁的表格 关注表中的列: follow int, -- 被关注实体的 id(可以是 用户或标签) follow_is_user bit, -- 被关注项是否为用户 follow_is_tag 位,--被关注的项是否为HashTag follower int -- 追随者的 id(这只能是 一个用户,所以你可能想把它变成一个外国人 用户表上的键)您可以将这两个位列压缩为一个,但这将允许您添加用户将来可以遵循的其他内容。
【讨论】:
appengine 数据库实现非常独特,我正在寻找具体的响应。以上是关于如何在 appengine 中为追随者流建模?的主要内容,如果未能解决你的问题,请参考以下文章