使用ListProperty Google App Engine Python的多对多关系

时间:2013-04-19 14:40:37

标签: python google-app-engine python-2.7 listproperty

我正在建立一个Facebook应用程序,需要访问用户的Facebook页面。场景是这样的: -

用户(管理员)可以有多个页面,一个页面有多个管理员。每个页面上都可以有多个帖子。我已经看过谷歌应用程序引擎文档(建模实体关系)。他们使用ListProperty来实现多对多关系和一对多关系的引用属性。

我认为类的结构就像

class User(db.Model):
    id = db.StringProperty(required=True)
    name = db.StringProperty(required=True)
    profile_url = db.StringProperty(required=True)
    access_token = db.StringProperty(required=True)
    pages = db.ListProperty(db.Key)


class Page(db.Model):
    id = db.StringProperty()
    name = db.StringProperty()
    page_access_token = db.TextProperty()
    users = db.ListProperty(db.Key)

class Post(db.Model):
    page = db.ReferenceProperty(User,collection_name='posts')
    post_content = db.TextProperty()
    published = db.BooleanProperty()

这是对的还是我确实需要改变它。 谢谢

1 个答案:

答案 0 :(得分:0)

有多种方式可以做多对多的关系。使用ListProperties是一种方法。如果使用ListProperties,请记住的限制是每个实体的索引数量有限制,以及总实体大小的限制。这意味着列表中的实体数量有限制(取决于您是先达到索引计数还是实体大小)。请参阅本页底部:https://developers.google.com/appengine/docs/python/datastore/overview

如果您认为引用的数量在此限制范围内,则这是一个很好的方法。考虑到你不会为一个页面拥有数千名管理员,这可能是正确的方法。

另一种方法是让一个中间实体对多对多的两边都有引用属性。这种方法可以让你扩展得更高,但由于所有额外的实体写入和读取,这要贵得多。