如何在 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 中为追随者流建模?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中实现追随者/追随者

节点Sequelize追随者/追随者关系

Laravel 追随者/追随者关系

如何使用 MongoDB 建模“点赞”投票系统

如何使用 django 模型制作追随者系统

[BZOJ3698] XWW的难题 网络流