app-engine(python)建模关系,我做错了吗?

时间:2010-02-11 18:34:05

标签: python google-app-engine google-cloud-datastore

使用以下模型我试图找出一种生成各种新闻源的方法,这样当用户登录时,他们会看到他们选择关注的栏的即将发生的事件列表。我是否可以查询类似“SELECT * FROM Barevent WHERE parent_bar IN UserprofileInstance.following”的内容?如果是这样,这会有效吗?

class Barprofile(db.Model):
    b_user          = db.UserProperty()
    created         = db.DateTimeProperty(auto_now_add=True)
    barname         = db.StringProperty()
    address         = db.PostalAddressProperty()
    zipcode         = db.StringProperty()

class Barevent(db.Model):
    created         = db.DateTimeProperty(auto_now_add=True)
    when            = db.DateProperty()
    starttime       = db.TimeProperty()
    endtime         = db.TimeProperty()
    description     = db.StringProperty(multiline=True)
    parent_bar      = db.ReferenceProperty(Barprofile, collection_name='bar_events')

class Userprofile(db.Model):
    b_user          = db.UserProperty()
    following       = db.ListProperty(db.Key)

3 个答案:

答案 0 :(得分:1)

您的模型和查询应该可以正常工作,效率不高。您需要记住的一件事是,如果删除Barprofile实体,您可能需要从每个Userprofile的以下属性中手动删除其键。拥有孤立的Barprofile引用不会破坏查询,但如果您将该列表用于其他目的(例如向用户显示他或她订阅的栏),如果您尝试查询该列表,则会出现错误键。

答案 1 :(得分:1)

您正在描述的结构将起作用,但请记住,“IN”运算符需要对列表中的每个项执行一个查询 - 因此可能会导致大量查询。

然而,你正在处理的是一个类似于Twitter的“分散 - 聚集”问题,所以你没有太多选择 - 你要么在这样的阅读时间收集东西,要么将它们广播给所有的听众用户在更新时。

答案 2 :(得分:0)

有很多方法可以进行GAE查询,但我不明白为什么你的查询不起作用。 如果你有一个特定的Barprofile(B),那么我认为你可以(在Python中)做;

   query = db.GqlQuery("SELECT * FROM Barevent WHERE parent_bar = :1,
                            B.b_user)
   day = query.get()

但是我不太清楚你为什么同时拥有Userprofile和Barprofile(所以我想你想重新考虑这三者)。

通常,您不需要(甚至不希望)在GAE中规范化数据,就像您习惯于传统的RDBMS环境一样。以这种方式规范化数据没有什么特别的优势,即不是在数据库中使用它来确保在应用程序级别实现一致性。