GQL - 选择所有父母特定孩子不在儿童中
我想要一个父级班(Group),其中任何数量的用户都可以加入。我想显示用户尚不在的所有组。我如何对这些数据建模,以及如何查询?对不起,没有提供任何代码,但我根本不知道。GQL - 选择所有父母特定孩子不在儿童中
编辑: 在SQL中,这将通过用户表,组表和GroupUser交叉表完成。和查询会去:
select *
from Group
where Group.ID not in
(
select GroupID
from GroupUser
where UserID = @userid
)
也许我不明确地提出我的问题,我显然是GAE的新手,我的术语可能是错误的。反正这里是我的解决方案:
class User(db.Model):
username = db.StringProperty()
class Group(db.Model):
users = db.ListProperty(db.Key)
要查找一组,并加入(有些简化):
groups = db.GqlQuery("SELECT * "
"FROM Group")
for g in groups:
if user.key() not in g.users:
group = g
break
group.users.append(user.key())
将会有成千上万的组和用户将成为他们的几十个成员?
您将遇到用户体验问题:您如何让用户从数千个组中选择?有50多页的分页表?
关于你的问题:当你解决以上问题,那么你可以正确标记组的用户已经是一个成员:
你可以简单的在内存中的所有用户群体(这是只有十的ID,对不对? ),并在显示组时简单地过滤它们。
Knego,谢谢。没关系用户体验。 Group/User示例只是一个示例。实际上,后端会自动将用户分配到他们不是成员的“组”。你能用一些代码示例来开发你的建议解决方案吗? – Landrew 2012-01-14 08:58:42
随机挑选组,如果用户还不是会员(组员为1:1000的机会很小),请将他添加到组中。如果是会员,请重复。 – 2012-01-14 09:34:32
正如Wooble所说,没有办法为App Engine数据存储构建像这样的查询。如果你的组数大大超过了用户实际所在的组数,你最好的选择就是选择所有的组,然后过滤出用户已经在的组 - 这正是SQL数据库给出的查询的功能。
GQL不能做到这一点。 (这也不是亲子关系,但这只是您的术语问题,并不影响实际功能。) – geoffspear 2012-01-13 20:57:28
那么请尝试超越术语并提出解决方案。这种关系在现实中很常见。 – Landrew 2012-01-13 21:06:11
你期望有多少组?您可以为每个用户存储一个组列表,并将其与所有组的列表进行比较,但这并不能很好地扩展。 – geoffspear 2012-01-13 21:07:45