【问题标题】:GQL - Select all parents where specific child is not in childrenGQL - 选择特定孩子不在孩子中的所有父母
【发布时间】:2012-01-13 20:18:54
【问题描述】:

我想要一个父类(组),任何数量的用户都可以加入。我想显示用户尚未在其中的所有组。如何建模此数据以及如何查询?很抱歉没有提供任何代码,但我根本不知道。

编辑: 在 SQL 中,这将通过一个 User 表、一个 Group 表和一个 GroupUser 交叉引用表来完成。查询会去:

select *
from Group
where Group.ID not in
(
 select GroupID
 from GroupUser
 where UserID = @userid
)

【问题讨论】:

  • GQL 无法做到这一点。 (这也不是父子关系,只是你的术语有问题,不影响实际运行。)
  • 那么,请尝试超越术语并提出解决方案。这种关系在现实中很常见。
  • 您希望有多少组?您可以存储每个用户的组列表并将其与所有组的列表进行比较,但这不能很好地扩展。
  • 我知道你要去哪里,但正如你所暗示的那样,这不合适,因为我的小组将在应用程序的整个生命周期内增长到数千人。请注意,用户/组只是我为了询问而编造的类型。
  • 术语在这里很重要,因为“子”和“父”表示 App Engine 中实体关系的具体含义。

标签: python google-app-engine gql datastore


【解决方案1】:

会有数千个组,用户将成为其中的成员?

您将遇到用户体验问题:如何让用户从数千个组中进行选择? 50+页的分页表?

关于您的问题:当您解决上述问题时,您可以正确标记组用户已经是:

您可以简单地将所有用户组保存在内存中(只有 10 个 ID,对吗?)并在显示组时简单地过滤它们。

【讨论】:

  • 克尼戈,谢谢。不用考虑用户体验。组/用户示例只是一个示例。实际上,后端会自动将用户分配到他们还不是成员的“组”。你能用一些代码示例开发你建议的解决方案吗?
  • 随机选择组,如果用户还不是成员(用户:组是 1:1000 的可能性很小)将他添加到组中。如果是成员,请重复。
【解决方案2】:

正如 Wooble 所说,没有办法为 App Engine 数据存储区构建这样的查询。如果您的组数大大超过了用户实际所在的组数,那么您最好的选择就是选择所有组,然后过滤掉用户已经在其中的组 - 这正是 SQL 数据库在给定该查询时会做的事情.

【讨论】:

    【解决方案3】:

    也许我的问题不清楚,我显然是 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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2018-08-11
      • 2019-06-10
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多