2010-03-31 38 views
8

我正在設計一個需要在數據庫中保存幾何形狀的應用程序。我還沒有選擇數據庫管理系統。我需要數據庫中的空間索引嗎?

在我的應用程序中,所有數據庫查詢都將有一個邊界框作爲輸入,並且作爲輸出,我希望該數據庫中的所有形狀。我知道具有空間索引的數據庫用於這種應用程序。但在我的應用程序中,而不是是類型爲「給我附近x/y的對象」或其他更復雜的查詢,這些查詢在GIS應用程序中很有用。

我打算具有數據庫沒有空間索引和查詢,有看起來像:

SELECT * FROM shapes WHERE x < max_x AND x > min_x AND y < max_y AND y > min_y 

而且在列x (double)y (double)指數。只要我能看到,我並不需要一個具有空間索引的數據庫,不管我的應用程序如何接近這種應用程序。

即使我想附近的查詢,那麼我可以創建一個足夠大的邊界框圍繞那個點。或者這會導致糟糕的表現?

我真的需要一個空間數據庫嗎?何時需要空間索引?

編輯: 搜索查詢,實際上是超過一個我在上面寫了先進的一點點,因爲我處理的幾何形狀我會輸入一個邊界框將返回多個形狀(有邊框),其在查詢中位於內部或與其干擾。但是我仍然認爲在閱讀完所有好的答案之後,我可以在沒有空間索引的情況下做到這一點。

+0

什麼是使用postgis或spatiallite的「成本」?我不明白你爲什麼不想使用它們。 – TheSteve0 2010-04-01 06:41:14

+0

@ TheSteve0:我還沒有決定我將使用哪些dbms。但是我想不限於具有空間索引的人。也許我會選擇分佈式NoSQL數據庫而不是RDBMS。 – Jonas 2010-04-01 09:02:12

+0

那麼你的用例是什麼 - 如果你不介意共享 – TheSteve0 2010-04-01 19:26:07

回答

2

我真的需要一個空間數據庫?

看起來你正在做的事情對你的應用程序來說可以正常工作。

即使我想有 附近查詢,然後我可以圍繞該 點 足夠大的邊框。

您可能需要考慮在Geohash上創建索引。建議將此方法用於索引Google App Engine上的地理空間點,例如索引功能受限的地方。 (Source

何時需要空間索引?

有許多情形,其中一個空間索引是有用的。首先,空間索引不僅可以處理點,還可以處理折線,多邊形和其他形狀。另外,正如您已經提到的那樣,有許多複雜的查詢操作可以應用於空間數據,其中適當的空間索引是必不可少的。

+0

謝謝! Geohash看起來非常好,感謝鏈接。是的,我的數據庫不僅可以處理點,還可以處理多邊形和線條。但是搜索查詢只會在邊界框上。 – Jonas 2010-04-01 19:57:47

2

不,你不需要這個空間索引。

需要空間索引來計算物體之間的距離,看一個點是否在另一個點的某個半徑內,等等......大多數時候需要考慮地理座標。南半球,北半球等......當你必須考慮地球的曲線時,這一切都會改變距離。

如果您一直在尋找x和y,那麼您將從同時獲得兩個項目的索引中受益。因此...不是列x上的索引和列y上的索引,而是列x和y上的索引組合。

+0

感謝您對組合索引的解釋和建議。 – Jonas 2010-04-01 19:49:12

1

如果你不超越你已經做的事情,那麼你就不需要空間索引,也不需要GIS。但是,我會仔細考慮您的要求以及應用程序越來越需要GIS系統的機會。這個過渡比之後的計劃要好得多。

GIS爲您提供了幾個優勢。首先,GIS具有特殊形狀的列,用於存儲關於幾何圖形所需的所有內容。它管理空間參考,座標元數據等.GIS提供了基於空間關係查詢數據以及修改幾何(聯合,提取,緩衝等)的強大方法。它處理點,線,多邊形等。您可以從拓撲操作中派生新的形狀。另外,幾乎所有的GIS系統都提供渲染數據的方法(這實際上取決於您選擇的GIS,但是當它存在時,它可以節省您的工作量)。

如果你有一個真正的GIS環境,你將只需要空間索引。如果你確實選擇了GIS環境,那麼使用空間索引 - 你真的不想在沒有它們的情況下工作。

+0

謝謝!我會仔細設計我的應用程序。我會盡量保持前端軟件的先進程序,並保持後端存儲的簡單性,以便我可以輕鬆擴展。 – Jonas 2010-04-01 19:53:28

2

要添加到現有的優秀的答案,性能可能會或可能是在這裏並不重要。

如果通過對x和y軸執行兩個範圍查詢並獲取結果的交集來模擬空間索引範圍查詢,那麼您就做了兩個查詢,它們可能會在交集之前返回比需要更多的數據。

在另一方面,這樣的查詢是由本地空間索引支持,因此將被有效地回答。

總而言之,如果你的空間查詢是瓶頸,你將需要使用空間索引。