0

地理的な場所 (国、都市など) が添付された IP アドレスの巨大なデータベースを構築しています。

現在、この単純なデータベース構造を使用しています。

id || ip_addr || country || city ||

私はすでにそれを構築し始めており、すでにほぼ 100 万件のレコードを持っています。問題は、多くの住所に同じ国が関連付けられており、データベースからのフェッチが非常に遅くなっていることです。

私がこれを行う場合、私は考えていました:

国テーブル:

countryID || countryName ||

都市テーブル:

cityID || cityName || countryID (for what country the city is in) ||

そして、ipTable :

id || ip_addr || countryID || cityID

フェッチが速くなりますか?

この方法はより効率的ですか (他の利点はありますか)? それとも、すでに持っているものに固執する必要がありますか?

4

2 に答える 2

2

はい、国と都市を別のテーブルに移動することは、実際には正規化であり、非常に良いステップです。正規化についてはさらに先に進みます。都市は国にあります。つまり、都市を知っていれば、その国も常に知っているということです。したがって、これを試してください:

id || ip_addr || cityID

都市テーブル:

id || cityName || countryID

国テーブル:

countryID || countryName

IP テーブルの国への追加参照は不要です。ワルシャワ (ポーランド)ワルシャワ(米国インディアナ州)など、複数の都市が同じ名前を持っている場合、この設計は問題にならないことに注意してください。データベースには重複した名前がありますが、ID は異なります。ID で都市を識別します。たまたま同じ名前を指している (ただし別の国)。

idただし、一意が存在するときに別の列がある理由がわかりませんip_addr(単一のIPに1つのアドレスしか添付されていない場合)?

ip_addr (ID) || cityID

IP アドレスは数値で表すことができ、数値で表す必要があることに注意してください (一部のデータベースにはそのためのデータベースが組み込まれています)。

最後に、通常、連続した範囲の IP が同じエリア/都市/地区に割り当てられます。すべての IP ではなく、ある範囲の IP を場所に割り当てることで、多くのスペースを節約できます。

于 2012-06-16T15:03:15.867 に答える
0

はい、通常、正規化によりパフォーマンスが向上します。通常、正規化の主な理由はデータの一貫性です。ただし、場合によっては、非正規化によって実際にパフォーマンスが向上します。これは、データ ウェアハウスとレポートで行われ、クエリの結果をフィルター処理して構成するために必要な結合の数を減らします。

ここで重要な点の 1 つは、データベースが大幅に小さくなり、より多くのデータが RAM に収まることです。

パフォーマンスのもう 1 つの重要なポイントは、一般的なクエリをサポートするインデックスを用意することです。
都市名で検索する場合はcityTable.cityName、 などにインデックスが必要です。このようにして、データベースはデータベース全体をスキャンするのではなく、いくつかのレコードを読み取るだけで、効率的な検索を使用してデータを見つけることができます。

于 2012-06-16T18:07:26.040 に答える