3

我正在尝试设计表格以建立追随者关系。

假设我有一个包含用户、主题标签和其他文本的 140char 记录流。

用户关注其他用户,也可以关注主题标签。

我在下面概述了我设计这个的方式,但是我的设计有两个限制。我想知道其他人是否有更聪明的方法来实现相同的目标。

这方面的问题是

  1. 为每条记录复制关注者列表
  2. 如果添加或删除了新的关注者,则必须更新“所有”记录。

编码

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)

有没有更聪明的方法来做到这一点?

4

4 回答 4

5

您要解决的问题称为扇出问题。

来自 Google App Engine 团队的 Brett Slatkin 就 App Engine 上的扇出问题提供了一个高效/可扩展的解决方案。你可以在这里找到演讲的视频:

http://code.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html

于 2010-05-30T00:52:54.430 回答
1

是的,正如其他人所指出的,这是扇出问题,感兴趣的人应该看看 Brett Slatkin 的演讲。

但是,我提出了 2 个具体限制,即

  • 为每条记录复制关注者列表

正如他们所说,这不是错误,而是功能。事实上,appengine 上的扇出就是通过这种方式扩展的。

  • 如果添加或删除了新的关注者,则必须更新“所有”记录。

要么,要么什么都不做,所以不遵循未来的记录。换句话说,一个人不只是跟随人们的潮流,而是在给定的时间跟随人们的潮流。因此,如果您在第 2 天取消关注,您的关注者流仍将显示来自第 1 天的用户记录,但不会显示第 2 天及以后的用户记录。[注意:这与 twitter 的做法不同]

于 2010-06-26T16:39:42.030 回答
0

您可以使用引用属性,然后在其中有一个包含关注者的公用表,您可以引用该表

于 2010-05-24T16:06:55.603 回答
-1

我不确定如何在 Google App-Engine 中执行此操作,但我会考虑的一种数据库架构是:

表:
    用户 -- 带有属性的用户表
    HashTag -- 带有属性的 HashTag 表
    Follows -- 定义谁跟随谁的表格

关注表中的列:
    follow int, -- 被关注实体的 id(可以是
                             用户或标签)
    follow_is_user bit, -- 被关注项是否为用户
    follow_is_tag 位,--被关注的项是否为HashTag
    follower int -- 追随者的 id(这只能是
                             一个用户,所以你可能想把它变成一个外国人
                             用户表上的键)

您可能可以将这两个位列压缩为一个,但这将允许您添加用户将来可以遵循的其他内容。

于 2010-05-24T16:36:12.063 回答