私は、人々が都市のさまざまなエリア(約10都市)に情報を投稿できるようにするアプリケーションを構築しています。この種の情報を持つ既存の(正規化された)データベース/データセットを知っていますか?または、最初から作成する必要がありますか?ポインタの提案は大歓迎です!
2 に答える
この場合の正規化はやや問題があります。アトミック性の要件では、単一の属性が特定のドメインの単一の値を格納することが指定されているため、座標系を見るとかなり曖昧になります。いくつかのオプションがあります。これらはそれぞれ完全に正規化されています。
別ポイント表
このアプローチでは、次のようなテーブルが作成されます (PostgreSQL 表記):
CREATE TABLE geo_points (
id bigserial not null unique,
x bigint,
y bigint,
z bigint,
primary key (x, y, z)
);
レコードはこのテーブルに入り、コメントは geo_points.id で結合されます。
ポイント型アプローチ
さまざまなデータベースには、ポイントを格納するためのタイプがあります。すべてが地上にあり、標高を追跡する必要がないと仮定すると、次のことができます。
CREATE TABLE tagged_location (
id bigserial not null unique,
user_id int references users(id),
location point,
comment text not null,
primary key (user_id, location)
);
このアプローチでは、ポイントが似'(134.22222, 94.4444)'
ている場合があり、異なる座標系がデータベース管理システムによってサポートされる場合があります。これらには、平面座標、球座標などを含めることができます。座標系を選択することは、距離計算などで使用される単位に影響を与えるため、非常に重要です。たとえば、球座標を使用する場合、通常、距離は度単位で測定されるため、マイルまたは km に変換する場合は、余分な作業が必要になります。
数値配列アプローチ
ポイントを数値配列として表すことができます。これは通常、ネイティブ ポイント タイプがない場合の回避策です。各配列は 1 つの場所の 2 次元または 3 次元の座標を表すため、これは 1NF を満たします。順序性は重要であるため、配列は全体として単一の値を表します (つまり、セットやバッグではなくタプルです)。これは、通常、独自の距離計算を行う必要があり、ポイントが次のようになることを除いて、ポイント タイプを使用した上記のアプローチと同等です。'{134.22222, 94.4444}'
最終的に、すべて完全に正規化された非常に多くの異なるアプローチにより、データベース設計の問題は、RDBMS とユースケースによって実際に制約されます。ユースケースに完全に適合する既成の設計はおそらく見つからないでしょう。
経度と緯度の2つの整数として保存できます(私の地理が正しければ)