2011-12-31 75 views
2

我在手機上爲本地應用程序創建了SQL本地數據庫,然後信息以相同格式上載到服務器上的數據庫。在表格中,我將GPS座標結構化爲一個帶有緯度和經度標籤的字符串。回顧一下,讓數據庫結構更加合理,這樣經度和緯度就像雙打類型一樣位於兩個單獨的列中(似乎它對搜索和排序效果更好)。爲GPS座標構建和搜索SQL數據庫/表格

如果我將字符串轉換爲兩個雙精度緯度和經度列,排序會快嗎?甚至有可能以這種格式搜索GPS座標:「x.xxxx y.yyyy」?有沒有更好的方法來排序/存儲SQL表中的GPS座標進行搜索?

回想起來,我希望我更仔細地計劃過這一點。我知道計劃爲你節省了大量的時間。那麼,我想這適用於這裏。

回答

2

是的,你應該使用單獨的列經緯度。浮點表示可能是也可能不是一個好主意;當搜索確切的座標時,這不會工作得太好。當查找一個值的範圍時,float將會很好。
根據您的表和查詢模式的大小,您可以考慮創建性能索引。

+0

由於使用相同的數字格式,你對索引的更多信息? – Stagleton 2011-12-31 16:53:51

+0

如果你知道你的表將會有點大(就數據庫引擎的原子I/O單元而言),比如說大於100kb或超過幾千條記錄*和*你知道哪種查詢將會是經常針對表發出(如果*查詢*預計會比*更新*或*插入*更頻繁發生),則應在搜索某些記錄時使用* create index *語句來提高性能。 – JimmyB 2011-12-31 17:21:40

0

是的,如果你需要在計算中分別使用這兩個數字,他們應該單獨保存。

如果您不關心數字的準確性,請使用Double類型,但請注意,數字存儲爲近似值,而不是它們的顯示。

如果您需要精確的輸出作爲輸入,請嘗試使用DecimalNumeric作爲類型。

點擊此處瞭解詳情:MYSQL precision math

2

您可以使用微度有效地存儲的值作爲整數。

int lat = (int)(location.getLatitude() * 1000000); 
int lon = (int)(location.getLongitude() * 1000000); 

有一個獎金,如果你要稍後添加一個MapView的,因爲Android地圖API在GeoPoint

+0

那麼,將整數值存儲起來效率會更高嗎? – Stagleton 2011-12-31 16:56:03

+0

與浮點數相比,這不會在數據庫*中帶來很大差異,但可能是緩解近似數字表示的缺點的一種好方法。 – JimmyB 2011-12-31 17:26:53

+0

我對ARM設備上的浮點性能沒有經驗。您可能會節省約50%的空間,4字節的INTEGER與SQLite中的8字節REALs。另外,Android文檔說[「根據經驗,浮點比Android設備上的整數慢大約2倍。」](http://developer.android.com/guide/practices/design/performance.html#避免飛濺),並建議儘可能避免它。 – ge0rg 2012-01-01 13:26:48