1

私はこれらの2つのデータストアを持っています:

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にデータを保存するためのより良いアイデアがない限り...つまり、頻繁に使用されるすべてのクエリをそこにチャックし、データストアに新しいアイテムが追加されたらキャッシュを更新します。

少し私の質問をフォローしている人にとって、このプロジェクトはソーシャルメディアの新しいコンセプトであり、完了したらリンクを投稿します:)

4

1 に答える 1

2

毎回データベースからすべての投稿を取得する必要はありません。フィルタクエリを使用して、特定のユーザーIDに一致するすべての投稿を取得します。

q = db.Query(Post)
q.filter('receiver =', uId)

すべての投稿を1つのmemcacheキーの下に保存しているために現時点でこれを実行できない場合は、アプローチを調整する必要があります。おそらく、拡張性は高くありません。上記のようなクエリを使用すると、GAEデータストアのインデックス作成およびクエリ機能を利用できます。これらの機能は、アプリケーションで設定されたエンティティ全体を直接反復するよりも常に優れています。

データストアからユーザーページを生成した後、ユーザーページをmemcacheに保存することをお勧めします。

また、では、とPostを使用できます:db.ReferencePropertysubmitterreceiver

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)

https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses#ReferenceProperty

于 2013-03-20T19:55:25.430 に答える