2011-12-31 17 views
2

アプリのために私の電話機にローカルでSQLデータベースを作成し、サーバ上のデータベースに同じ形式で情報をアップロードしました。テーブルでは、私は緯度と経度の間のタブを持つ文字列として構造化されたGPS座標を持っています。これを振り返ってみると、データベースを構造化して、緯度と経度が2倍の型の2つの別々の列になるようにするのがより理にかなっています(検索とソートの方が優れているようです)。GPS座標のSQLデータベース/テーブルの構造化と検索

文字列を2倍の緯度と経度の列に変換すると、ソートする方がはるかに高速でしょうか?このフォーマットのGPS座標を検索することも可能ですか: "x.xxxx y.yyyy"?検索のためにSQLテーブル内のGPS座標をソート/ストアするより良い方法はありますか?

振り返ってみると、私はこれをさらに注意深く計画したかったと思います。私は計画があなたの道のりで多くの時間を節約することを知っています。まあ、私はここに当てはまると思います。

答えて

2

はい、lat/lonには別の列を使用する必要があります。
浮動小数点表現は良い考えであるかもしれません。正確な座標を検索すると、これはあまりうまく機能しません。値の範囲を探すときは、floatはうまくいくでしょう。
テーブルとクエリパターンのサイズに応じて、パフォーマンスのためのインデックスを作成することを検討することもできます。

+0

おかげで同じ番号の形式を使用しているため、あなたはインデックスに関する詳細な情報を持っているか、後でのMapViewを追加しようとしている場合、ボーナスはありますか? – Stagleton

+0

あなたのテーブルが(データベースエンジンのアトミックI/Oユニットの観点から)やや大きめになることが分かっているなら、約100kb以上、数千ものレコード*や* (* query *が* updates *や* inserts *よりも頻繁に発生することが予想される場合)、* create index *ステートメントを使用して、特定のレコードを検索するときのパフォーマンスを向上させる必要があります。 – JimmyB

0

はい計算で2つの数値を別々に使用する必要がある場合は、別々に保管する必要があります。

数字の正確さに気にしない場合は、タイプDoubleを使用してください。数字は近似値として保存されていて、表示されていないことを警告してください。

入力として正確な出力が必要な場合は、タイプとしてDecimalまたはNumericを試してみてください。ここ

詳細情報:MYSQL precision math

2

あなたは整数として効率的に値を格納するためにマイクロ度を使用することができます。

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

あなたは、Android Maps APIをがGeoPoint

+0

したがって、値を整数として保存する方がずっと効率的ですか? – Stagleton

+0

これは、浮動小数点数と比較してパフォーマンス*をデータベース*で大幅に変えるべきではありませんが、おおよその数値表現の欠点を緩和する良い方法かもしれません。 – JimmyB

+0

私はARMデバイスの浮動小数点のパフォーマンスに慣れていません。おそらくSQLiteに4バイトのINTEGERと8バイトのREALのスペースの約50%を節約します。また、アンドロイドのドキュメントでは、["経験則として、浮動小数点はAndroidデバイスの整数より約2倍遅いです。"](http://developer.android.com/guide/practices/design/performance.html##可能であれば、回避することを推奨します。 – ge0rg