2011-11-18 58 views

回答

6

PolyModel使用「class」列表屬性來存儲PolyModel實例「所在」的所有類。所以如果你有一個名爲Bar的子類的PolyModel Foo,Bar的任何實例都會在它的「class」屬性中有[u'Foo',u'Bar']。 Bar的實例實際上作爲Foo的實例存儲在數據存儲中,在「class」屬性中帶有Bar模型名稱。

需要將「class」屬性編入索引,以便每次寫入PolyModel子類時都會對列表中的每個類名稱(一個用於降序,一個用於升序)進行額外的兩次寫入「class」索引,所以如果模型的「class」屬性包含[u'Foo',u'Bar'],需要4次額外的索引寫入來寫入該模型。

當您查詢數據存儲以獲取Foo實例時,數據存儲可以查看每個將Foo作爲父模型的模型,而無需對「類」屬性進行必要的過濾(我不確定它是否過濾在課堂上,但我懷疑它沒有)。

當您查詢數據存儲的Bar實例時,它實際上查詢Foo的實例,但在「class」屬性上應用過濾器以將結果過濾爲Bar類型的模型。如果您沒有應用其他篩選器和排序順序,您可能不會在組合索引中注意到這一點,但是如果應用篩選器並對數據存儲進行排序,則可能需要您的組合索引包含「class」屬性,這可能需要您具有更多的組合索引並寫入更多的複合索引。

我的一個應用程序在PolyModel上使用多級繼承,幾乎每個查詢都在「創建的」DateTimeProperty上排序。每個查詢都需要一個包含「class」的組合索引。在我的情況下,額外的索引寫入已經完全值得,因爲PolyModel允許我以很好的方式對數據進行建模。

更新於2012年2月7日包含來自@Nick的信息。

+0

布賴斯優秀的東西,謝謝 – Yarin

+1

類屬性實際上是一個列表;對於任何polymodel子類,它將包含至少2個條目;與內置索引這意味着至少4個索引寫入。 –