关于GAE数据存储区的索引

时间:2011-04-21 04:16:22

标签: database google-app-engine indexing

我在GAE应用程序中有以下模型。

class User
    school_name = db.StringProperty(Indexed=True)
    country = db.StringProperty(Indexed=True)
    city = db.StringProperty(Indexed=True)
    sex = db.StringProperty(Indexed=True)
    profession = db.StringProperty(Indexed=True)
    joined_date = db.DateTimeProperty(Indexed=True)

我希望通过这些字段的组合来过滤用户。过滤器的结果应该首先向用户显示最近加入的用户。因此,我认为这意味着任何查询都按订单操作结束。那样:

User.all().filter('country =','US').filter('profession =','SE').order('-joined_date')
User.all().filter('school_name =','AAA').filter('profession =','SE').order('-joined_date')
....
User.all().filter('sex =','Female').filter('profession =','HR').order('-joined_date')

所有这些字段组合将是C(5,1)+ C(5,2)+ ... + C(5,5)= 31.

我的问题是要实现它,我是否需要在Google AppEngine中为所有这些案例(31)创建索引。或者你能建议其他方式来实现吗?

注意:C(n,k)是组合公式,详见http://en.wikipedia.org/wiki/Combination

提前致谢!

1 个答案:

答案 0 :(得分:4)

您有几种选择:

  1. 按照建议创建所有31个索引。
  2. 在内存中进行排序。如果没有排序顺序,您可以使用内置的合并连接策略执行所有查询,因此您根本不需要任何索引。
  3. 将查询限制为更有可能的查询,或者将查询限制在大多数不匹配结果中,并在内存中执行其他过滤。
  4. 将所有数据放在ListProperty中,以便作为“key:value”字符串进行索引,并仅对其进行过滤。您将需要在该字段上创建具有不同出现次数的多个索引(例如,将其索引一次,两次等),这将导致相同数量的索引条目,但使用的自定义索引更少。