使用以下模型我试图找出一种生成各种新闻源的方法,这样当用户登录时,他们会看到他们选择关注的栏的即将发生的事件列表。我是否可以查询类似“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)
答案 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环境一样。以这种方式规范化数据没有什么特别的优势,即不是在数据库中使用它来确保在应用程序级别实现一致性。