Mekansal / nitelik sorguları çalıştırmak için Google AppEngine kullanıyoruz ve asıl mesele (ilk günden itibaren), büyük miktarda keyfi büyüklükteki satırları / çokgenleri endekslemektir. Nokta verileri çok zor değil (geohash, geomodel, vb. Bakınız) ancak rastgele kümelenmiş küçük / büyük çokgen kümeleri her zaman bir sorun olmuştur (ve bazı durumlarda, yine de)
GAE'de çeşitli uzamsal dizin oluşturma sürümleri denedim ancak çoğu yalnızca iki seçeneğin varyantları. Hiçbiri SQL veritabanları kadar hızlı değildi ve hepsinin artıları / eksileri var. Tradeoffs olsa da, çoğu internet tabanlı haritalama uygulamaları için makul görünüyor. Ayrıca, son arama parametrelerine uymayan özellikleri kaldırmak için aşağıdaki ikisinin bellek içi geometri temizleme (JTS vb.) İle birleştirilmesi gerekir. ve son olarak, GAE'ye özgü özelliklere güveniyorlar ancak diğer mimarilere uygulanabileceğinden eminim (veya bir linux kümesinde, ec2 vb. çalıştırmak için TyphoonAE kullanın)
Izgaralar - Belirli bir alanın tüm özelliklerini bilinen bir ızgara dizinine paketleyin. Izgaraya küçük bir uzamsal dizin yerleştirin, böylece içerdiği özellik kümesinde hızlıca gezinebilirsiniz. Sorguların çoğu için, tam ızgara adlandırma kuralını ve K / V varlıklarıyla (ne olur sorgular değil) ilişkili olduğunu bildiğiniz için hızlı olan bir avuç ızgara çekmeniz gerekir.
Artıları - oldukça hızlı, uygulaması kolay, hafıza alanı yok.
Eksileri - Ön işleme gerekli, kullanıcının şebeke büyüklüğüne karar vermesi gerekiyor, büyük geomalar birkaç şebekede paylaşılıyor, kümeleme, şebekelerin aşırı yüklenmesine neden olabilir, seri hale getirme / seri kaldırma maliyetleri bir sorun olabilir (protokol tamponları ile sıkıştırıldığında bile)
QuadKeys - Bu mevcut uygulama. Temel olarak, ayarlanmış bir ızgara seviyesi olmaması dışında, Izgaralar ile aynıdır. özellikler eklendikçe, sınırlarını tamamen içeren quadkey ızgarası tarafından dizine eklenirler (veya bazı durumlarda, tek bir quadkey kullanılamadığında ikiye bölünürler, dateline düşünün). Qk bulunduktan sonra, özelliğin daha ince taneli sunumunu sağlayan az sayıda daha küçük qk'ye bölünür. bu özelliğe ilişkin bir işaretçi / kutu, daha sonra sorgulanabilen hafif bir kılavuz dizisine (özellikler grubu) yerleştirilir (özgün bir tasarım doğrudan özellikleri sorguladı, ancak sonuçların büyük olduğu durumlarda çok yavaş / CPU yoğunluğu ortaya çıktı)
Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png
Poligon Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png
Yukarıda kullanılan dörtlü adlandırma kuralı iyi bilinmektedir ve daha da önemlisi, yerleşimi korumaya meyillidir ( burada daha fazla tarif edilmiştir ).
Yukarıdaki çokgen şunun gibi görünüyor:
Sorgu sınırları yeterince küçükse, doğrudan qk ile getirebilirsiniz. bu, GAE veri deposuna yalnızca tek bir toplu rpc çağrısı olduğundan en uygunudur. eğer sınırlar çok fazla muhtemel qks (> 1000) içerecek kadar büyükse, alternatif olarak bir filtre kullanarak sorgulayabilirsiniz (örneğin: qk> = 0320101013 ve qk <= 0320101013 + \ ufffd). Quadkey adlandırma kuralı ve GAE dizelerinin dizini oluşturması yukarıdaki sorgunun yalnızca bu qk değerinin altına düşen varolan ızgaraları almasına izin verir .
başka uyarılar ve performans sorunları var ama genel olarak, onu dörtlü anahtarlar üzerinde sorgulama yeteneği mümkün kılıyor
örnekler - ABD'deki ilçelerdeki sorgu: geojson
Artıları - oldukça hızlı, ızgara boyutu yapılandırması yok, hafıza alanı yok, kalabalık ızgaralar yok
Eksileri - ön işleme gerekli, bazı senaryolarda üst üste gelme, kutupsal veri yok
Boşluk Doldurma Eğrileri - Alfred'in NextGen Queries konuşmasına bu yıl Google I / O'da bir göz atın . Yeni MultiQuery operatörleri (paralel olarak çalışan) ile birlikte genel uzay / zaman doldurma eğrilerinin dahil edilmesi, gerçekten harika uzaysal sorguları mümkün kılacaktır. Geleneksel SQL performansını yenecek mi? Söylemesi zor ama gerçekten iyi ölçeklenmeli. Ve her zaman tüm şekillerde / boyutlarda mobil cihazların sitenize / hizmetinize olan trafiği önemli ölçüde artıracağı bir geleceğe hızla yaklaşıyoruz.
Son olarak, SQL üzerinden NoSQL'i seçmeden önce problem alanınıza çok yakından bakmanız gerektiğine de katılıyorum. Bizim durumumuzda, GAE'nin fiyatlandırma modelini gerçekten çok sevdim, bu yüzden gerçekten bir seçenek yoktu, ancak ölçeklendirilmeniz gerekmiyorsa, biraz zaman kazanın ve sadece standart bir sql db kullanın.