2011-04-21 57 views
2

我在GAE應用程序中有以下模型。關於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

您所描述的問題稱爲「爆炸索引」。下面的尼克對你有一些很好的建議。 – 2011-04-21 11:54:35

+0

謝謝賈斯汀,現在我知道它被稱爲'爆炸索引' – Nyambaa 2011-04-21 12:16:02

回答

4

您有幾種選擇:

  1. 創建31個指標,按照你的建議。
  2. 在內存中進行排序。如果沒有排序順序,所有的查詢都可以使用內置的合併連接策略執行,所以你根本不需要任何索引。
  3. 將查詢限制爲更有可能的查詢或那些消除大部分不匹配結果的查詢,並在內存中執行額外的過濾。
  4. 將所有數據都放在ListProperty中,作爲「key:value」字符串進行索引,並僅對其進行過濾。您需要在該字段上創建多個具有不同出現次數的索引(例如,對其索引一次,兩次等),並且會導致相同數量的索引條目,但使用的自定義索引更少。