appengine(python)建模关系,我做错了吗?

2024-10-02 22:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下模型,我试图找出一种方法来生成各种类型的新闻提要,这样当用户登录时,他们将看到一个他们选择关注的酒吧即将发生的事件的列表。我可以查询类似“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)

Tags: trueautodbmodelbarclassparentfollowing
3条回答

您的模型和查询应该可以正常工作,并且不会效率低下。您需要记住的一点是,如果Barprofile实体被删除,您可能需要从每个Userprofile的following属性中手动删除它们的键。有一个孤立的Barprofile引用不会中断查询,但是如果您将该列表用于其他目的(例如向用户显示他或她订阅了哪些条),那么如果您试图查询该键,则会出现错误。在

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

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

但我不太清楚为什么你同时有一个Userprofile和一个Barprofile(所以我想你应该重新考虑这三个)。在

一般来说,您不需要(甚至不想)在GAE中规范化数据,就像您习惯于在传统RDBMS环境中那样。以这种方式规范化您的数据已经没有什么特别的好处了,也就是说,您现在不需要在应用程序级别上对数据库进行调整以确保一致性。在

您所描述的结构可以工作,但是要记住'in'操作符需要对列表中的每个项执行一个查询,因此可能会导致大量查询。在

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

相关问题 更多 >