2011-01-06 7 views
3

私は、リレーショナルデータベースに地理的データを保存し、その場所(国、州または同様の座標ではない)に基づいてデータを照会することができます。リレーションDBに地理情報を格納する最良の方法は何ですか?

私の現在の解決策は、私のテーブルに4つの余分なフィールド(私が興味を持っているすべての国が2または3の管理部門を持つ)を持ち、文字列にフィルターをかけることです。しかし、これは悪い解決策であり、私のテーブルを正常化したいと思います。

は、私はまた、データが私のユーザーが訪問したいページを決定するために、「/アメリカ/カリフォルニア/ san_fransisco/...」

唯一の他のソリューションのような要求をルックアップするために、単純ななければならないことを使用します。私は、それらの4つの余分なフィールドを別のテーブルに格納して、それらを外部キーとリンクすることを考え出すことができますが、それは国名がいくつかの行に重複してしまうようなデータの重複を意味します。

これを実行する方法はありますか?

+0

GPS座標、境界線、幾何学的データなどのデータを保存することもできますか?それはGISソリューションにつながる可能性がありますが、それは必要ないように思えます... – FrustratedWithFormsDesigner

+0

地理的なデータ以外に、私は各行にテキストを保存します。 – UllaBulla

答えて

2

ノーマライズは間違いなく道のりです。データベースはそのように機能するように設計されています。はい、クエリが長く見えるかもしれませんが、それほど悪くはありません。

0

あなたは正しい情報をテーブルに入れています。彼らはルックアップテーブルと呼ばれる。完全なリレーショナルルートを使用する場合は、エンティティのリンクを都市ルックアップテーブルの外部キーと関連付けることができます。都市表は状態表にリンクしています。州表は国表にリンクしています。エンティティの元のテーブルにデータ表示用の完全な場所のテキスト版を保存することもできます。

+0

私は都市国家と国家との関係をあなたが描写しているように思っていますが、それは要求を探す仕事のようです。 Webリクエストごとに3つの結合でクエリを作成する必要はありませんか? – UllaBulla

+0

私の下の偽のように、それは高価な参加ではありません。文字列に基づいて調べることは、実際には結合よりもはるかに遅いです。 – John

0

私の現在のソリューションは、文字列の上に私のテーブルやフィルタに(私が興味を持ってるすべての国が2つのまたは3管理部門を持っている)4つの余分なフィールドを持つことです。しかし、これは悪い解決策であり、私のテーブルを正常化したいと思います。

私はこれが悪い解決策ではないと思います。行ごとに単純な地理的/アドレスベースの情報を格納し、WHEREを使用して一致するすべてのレコードをフェッチすることは、かなり標準的な手順です。別のテーブルにリンクするために外部キーを使用することは、追加の作業になり、それ以上の高速化はありません。

ただし、RESTfulインターフェイスを使用した検索/リクエスト(お勧めのとおり)は良いアイデアです。

+0

おそらく、私は正規化について心配する必要はないでしょう。しかし、私はまだ自分の将来を阻害することを恐れています。他の言語などへの翻訳のサポートを追加することにしました。 – UllaBulla

+0

UPDATE WHEREを使用するクエリは、これらのタイプのケースを適切に処理します。以下のあなたの他のコメントについて: –

+0

おっと、行の中断を入れるのではなく、Enterキーが送信されたことに気付かなかった。とにかく、あなたのコメントは「私はそれぞれのWebリクエストに対して3つの結合でクエリを作成する必要はないだろうか?このような複数のテーブルを使用する場合は正しいです。あなたが関係的に考えることができ、結果として「強力」と感じるかもしれないという理由だけで、それは最良の解決策にはなりません。 DESCRIBE SELECTを使用してパフォーマンスを比較し、自分で確認してください。 –

0

正規化されたルートに移動します。テーブルの結合は、遅くないか、複雑ではありません。各テーブルのPKは、クラスタ化インデックスを持つ整数になります。外部キーにはインデックスがあります。参加は飛ぶ予定です。

都市をドロップダウンリストに表示する場合は、重複は不要です。州の下にあるすべての都市をリストすることができます。正規化されていないと、「distinct」でクエリが遅くなります。正規化されていないルートが遅くなることを保証します。皮肉なこと?

しかし、正規化されていない場合があります。数百万のアドレスがあります。おそらくあなたのアプリケーションのすべてのアドレスを入力することは不可能でしょう。あなたは.....フリーテキスト入力をユーザに依存するつもりです。この場合、正確な正確性や重複は気にせず、妥当性を検証するための網羅的なデータが不可能であるため、データが何であっても受け入れるだけです。また、入力を信頼していないので、 "ルックアップ"テーブルへの挿入を気にする必要はありません。

さまざまな国に柔軟に対応できるようにするには、控えめなモデルを使用してください。いくつかの国には州、郡などがないかもしれません。それらはすべて独自の階層を持っています。

+0

私は正規化されたソリューションを持っているのが大好きですが、Webリクエストから簡単に検索する方法はありません。私はデータベースには本当に新しいので、私は何かが不足しているかもしれませんが、正規化されたソリューションでクエリにこのようなものを作成する必要はありません: "SELECT * FROM data INNER JOIN city ON data.path_key = city.key INNER JOIN状態ON city.parent = state.key INNER JOIN国ON state.parent = country.key WHERE data.name = 'city_park' AND city.name = 'san_fransisco' AND state.name = 'california' AND country.name = 'usa ''(長いクエリには申し訳ありません) – UllaBulla

+0

テーブルの名前を「データ」にしないでください。名前はデータを記述する必要があります。 これをモデル化する方法は次のとおりです。 PK列のクラスタード・インデックスでは、FKの通常の索引が使用されます。 国 --------- idCountry int型PK COUNTRYNAME VARCHAR(60) COUNTRYNAME 上で一意制約 州 --------- idState int型PK idCountry int型FK ステート名のVARCHAR(60) コンボidCountry /ステート名に一意の制約 市 --------- idCity int型PK idState int型FK CityNameのVARCHAR(60) ユニーク制約コンボidState/CityNameに PointOfInterest --------- idPOI int PK idCity int FK POIName varchar(60) コンボの一意制約idCity/POIName – Fake

関連する問題