有點背景優先:GeoModel是我寫的一個庫,它爲App Engine應用程序增加了非常基本的地理空間索引和查詢功能。它與地理散亂相似。 GeoModel中的等效位置散列稱爲「地理單元」。App Engine:13 StringPropertys與1 StringListProperty(w.r.t.索引/存儲和查詢性能)
目前,GeoModel庫向每個位置感知實體添加13個屬性(location_geocell__n_,n = 1..13)。例如,一個實體可以具有屬性值,例如:
location_geocell_1 = 'a'
location_geocell_2 = 'a3'
location_geocell_3 = 'a3f'
...
這是必需的,以便空間查詢期間不使用了一個不等式過濾器。
13屬性方法的問題是,對於任何應用程序想要運行的地理查詢,必須定義和構建13個新索引。這絕對是一個維護的麻煩,因爲我剛剛在重寫項目的演示應用程序時意識到了這一點。這導致我的第一個問題:
問題1:每個索引是否有任何顯着的存儲開銷?即如果我有13個索引,每個索引有n個實體,而索引中有13個實體,則前者在存儲方面比前者差得多?
似乎對(1)的回答是否定的,根據this article,但我只想看看是否有人有不同的經歷。
現在,我正在考慮調整地質模型庫,這樣,而不是13點的屬性,有好多隻能是一個StringListProperty叫location_geocells,即:
location_geocells = ['a', 'a3', 'a3f']
這將導致一個更清潔的index.yaml
。但是,我做題對性能的影響:
問題2:如果我從13個字符串屬性切換到1 StringListProperty,將查詢性能產生不利影響;我目前的過濾器看起來像:
query.filter('location_geocell_%d =' % len(search_cell), search_cell)
和新的過濾器將類似於:
query.filter('location_geocells =', search_cell)
注意,第一個查詢具有_n_實體的搜索空間,而第二查詢有_13n_實體的搜索空間。
這似乎是答案(2)是兩個結果相同的查詢性能,每提示#6 this blog post,但同樣,我想看看如果任何人有任何與此不同的現實世界的經驗。
最後,如果有人有任何其他建議或提示可以幫助提高存儲利用率,查詢性能和/或易用性(特別是w.r.t. index.yaml),請告訴我! 13N條目在一個索引或多或少相當於N個項目在13個指標 - 源可以在這裏geomodel & geomodel.py
更多有關存儲空間的不同屬性類型和索引行數:http://code.google.com/appengine/articles/storage_breakdown.html – ryan 2011-01-25 23:06:35