Jeo uzamsal veriler için bir Anahtar Değer deposu kullanabilmemin bir yolu var mı?


26

Geçmişte birçok ilişkisel veritabanını kullandım, ancak tüm NoSQL veritabanlarını da okudum ve Anahtar-Değer depoları birbiriyle iç içe görünüyor.

Geometrik nesneyi saklarken çoğunlukla, indeksli beş sütun ID, MIN_X, MAX_X, MIN_Y ve MAX_Y kullanıyorum (burada X ve Y bir harita projeksiyonunda). Diğer verilerimde bir endekse ihtiyacım yok.

Belirli bir yerde (harita dikdörtgeni) nesneleri aramak için X ve Y değerlerine ihtiyacım var ve belirtilen bir nesneyi güncellemek istersem ID değerine ihtiyacım var.

Bunun için bir Anahtar Değer deposu kullanabilmemin bir yolu var mı?

Yanıtlar:


18

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.


GAE'den bahsediyorsunuz, ama hangi veritabanını kullanıyorsunuz? Birkaç tane var: cloud.google.com/products/storage
Don McCurdy

11

Lokal tabanlı veriler için CouchDB'nin bir uygulaması olan GeoCouch'ı duydum. Ayrıca MongoDB'nin coğrafi indeksleme yeteneklerinin olduğunu düşünüyorum.


Evet, ikisi de yapar ve SimpleGeo Cassandra'ya mekansal bir uzantı inşa ediyor. Voldemort veya MemCache'de hiçbir şey duymadım
TheSteve0

Oh, SimpleGeo’nun yaptıklarını seviyorum. Kıskanıyorum ve onlar için çalışmayı çok isterim!
JoshFinnie

8

Bu esas olarak algoritmalar hakkında bir sorudur. Yığın Taşması sormak için iyi bir yer olabilir.

Her durumda, doğrudan sorunuzun cevabı "evet, mekansal verileri temsil etmek için bir kvp deposu kullanabilirsiniz." Bununla birlikte daha iyi bir soru, "Mekansal verileri temsil etmek için bir kvp deposu kullanmalı mıyım?" Olabilir.

Bu sorunun cevabı (diğerleri gibi) “bağlıdır”. Bu, ölçeğinize, (işlemsel) iş yükünüze, verilerin niteliğine ve emrinizde olan hesaplama altyapısına bağlıdır.

Bir kvp deposunda düşük hacme sahip olacak ve bu da yüksek hacimli ekleme ve güncelleme paralelliği için verim artışına yardımcı olabilir. Ancak, bir mekansal arama yapmak çok hızlı olmayacak (bir dikdörtgenin içindeki tüm nesneleri bulun). Bunun için, bir R-Tree gibi, uzamsal bir dizin istersiniz.

Ancak, gerçekten büyük bir veri hacminiz ve çok büyük bir bilgisayar kümeniz varsa, bir kvp dizini kullanmak bazı perormance faydaları sağlayabilir. Kesin olarak bilmenin tek yolu, gerçek verileri kullanarak ve karşılaşmayı beklediğiniz pattenslere erişerek mükemmel ölçümler almanız.

Güncelleme :

İşte biraz daha fazla bilgi. Mekansal arama yapmak için KVP mağazasını kullanabilirsiniz. Sorun, yavaş olması. Nedenini görmek için şöyle bir şey düşünün:

  ***********
  ***********
  ***********
  ***********
  ****###****
  ****###****
  ****###****
  ***********
  ***********
  ***********
  ***********

* Ve #, nesneleri temsil ettiğinde, köken sol üst köşede olacak şekilde 11x11 ızgarasında ortaya koyulur. Dikdörtgen (4,4) - (7,7) içindeki nesneleri aradığınızı hayal edin. Bu tüm "#" lerini bulmalı. Dizinlerinizi KVP mağazasında temsil etmek için b + -tree kullandığınızı varsayarsak, sonuçları "X" dizini veya "Y" dizini kullanarak bulabilirsiniz. Bu durumda, hangisi olduğu önemli değil. Tartışma için, x endeksini kullanacağım. "4" X değerine sahip ilk düğümü bulmak için X dizininde bir günlük (n) araması yapar ve daha sonra 7'den büyük bir düğüm bulana kadar b + - ağaç yaprağı düğümlerini yineler. x dizini boyunca yineleyin, ardından istediğiniz y aralığının dışında olan herhangi bir şeyi reddedersiniz.

Bu yavaş. Aynı yoğunlukta büyük bir ızgara üzerinde hayal edin, 100 K * 100 K diyelim. Burada sadece 9 kayıt bulmak için "300, 000" indeks girişlerini taramanız gerekir. Bununla birlikte, tam olarak dengelenmiş bir R-Tree kullanıyorsanız, indeks araması muhtemelen sadece yaklaşık 90 kayıt taraması yeterli olacaktır. Bu çok büyük bir fark.

Ancak sorun, bir R-Tree'yi dengede tutmanın pahalı olmasıdır. Bu yüzden cevabı "bağlıdır" ve neden "bunu yapmalıyım" sorusu "nasıl yaparım" dan çok daha önemlidir.

Kayıtları çok fazla ekleyip kaldırırsanız ve çoğunlukla "nesne kimliği" araması yaparsanız ve sık sık "uzamsal" aramayı yapmazsanız, KVP dizininizi kullanmak, sistemi gerçekten kullanmak istediğiniz şey için daha iyi performans verecektir. . Ancak, nadiren ekler veya silerseniz, ancak çok fazla mekansal arama yaparsanız, bir R-Ağacı kullanmak istersiniz.


"Evet, yapabilirsin" gibi bir cevabı kabul etmem. çünkü NASIL bilmek istiyorum . Ve "Bilmeliyim .." daha iyi bir soru değil çünkü dediğiniz gibi "bağlıdır"
Jonas,

1
Sana karşı çıkmak zorundayım. Yararlı bir sistem kurmak veya benzer sistemler inşa eden diğer insanlar için internette faydalı bir referans bırakmak istiyorsanız, o zaman "yapmalıyım" dan çok daha önemli olmalıyım. Yardımcı olma adına, ancak nasıl yapılacağı hakkında biraz bilgi vermeniz için cevabımı düzenledim.
Scott Wisniewski

@Jonas Aldığım "tavsiye" cevaplarının, soruyu sorma biçiminden kaynaklandığına inanıyorum: "ama aynı zamanda tüm NoSQL veritabanlarını da okudum ve Anahtar-Değerli mağazalar ilginç görünüyor." Bu, bir problem arayan çözümün tüm özelliklerine sahiptir.
JasonBirch

NoSQL bir problemi çözüyor, fakat pratikte kimsenin sahip olmadığı bir problem, çünkü yeterince büyük bir ölçekte çalışmıyorlar. Ne yazık ki, kendi sistemlerimizin, olayların gerçekte olduğundan daha büyük olduğunu düşünmek her zaman güzeldir. :)
JamesRyan


1

Çoğu durumda, ilişkisel veri deposundan, anahtar / değer veya anahtar / değer / tür depolama alanlarından daha fazla fayda elde edersiniz. Bu tür veri şemaları üzerinde etkili bir şekilde sorgulama ve raporlama konusunda önemli karmaşıklıklar vardır.

Tavsiyem, nasıl kullanılacağını düşünmeden önce ölçeğinizin NoSQL gerektirip gerektirmediğini yakından değerlendirmek olacaktır.


1
İşte bir noktanın bir geometrinin içinde mi yoksa dışında mı olduğunu hesaplamanız gerekirse, sahip olabileceğiniz bir problemin örneği (ve buna bir çözüm). code.google.com/p/giscloud/wiki/SerializedSpatialIndexes
Jon Bringhurst

Hey @Jon, bu bir Cevap olarak daha iyi olurdu. Bu şekilde kendi başına durabilir ve eğer insanlar hak ettiğini düşünürse kredi alırsınız!
JasonBirch




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.