3

フォロワー関係を構築するためのテーブルを設計しようとしています。

ユーザー、ハッシュタグ、その他のテキストを含む140文字のレコードのストリームがあるとします。

ユーザーは他のユーザーをフォローし、ハッシュタグをフォローすることもできます。

これを設計した方法の概要を以下に示しますが、設計には2つの制限があります。他の人が同じ目標を達成するためのより賢い方法を持っているかどうか疑問に思いました。

これに関する問題は

  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 AppEngineチームのBrettSlatkinが、AppEngineのファンアウト問題に対する効率的でスケーラブルなソリューションについて講演しました。あなたはここで話のビデオを見つけることができます:

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

于 2010-05-30T00:52:54.430 に答える
1

はい、これは他の人が指摘しているようにファンアウトの問題であり、BrettSlatkinの話は興味のある人が見る必要があります。

しかし、私は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 -- 誰が誰をフォローしているかを定義するテーブル

次の表の列:
    followed int, -- フォローされたエンティティの ID (
                             ユーザーまたはハッシュタグ)
    followed_is_user bit, -- フォローしているアイテムがユーザーかどうか
    followed_is_tag bit, -- フォローされているアイテムが HashTag かどうか
    follower int -- フォロワーの ID (これは
                             ユーザーなので、これを外国人にしたいかもしれません
                             ユーザーテーブルのキー)

おそらく、2 つのビット列を 1 つに凝縮することもできますが、これにより、ユーザーが将来従う可能性のある他のものを追加することができます。

于 2010-05-24T16:36:12.063 に答える