2012-03-04 7 views
0

私は、以下を格納するアプリケーションをビルドしています:People、Places、およびPosts。ジオロケーションとデータベーススキーマ

人々は投稿を作成してプレイスに参加することができ、投稿はプレイスにも属します。

投稿を閲覧しているユーザーは、作成された投稿の場所を見ることができます。ロンドン、英国。彼らはその場所をクリックし、その場所にも掲示されている他の投稿のリストを見ることができます。

アプリケーションのホームページで、ジオロケーションを使用すると現在のユーザーの場所が取得され、近くに投稿されたポストのバブルのオーバーレイが表示され、クリックすると地図が表示されます役職。

すべては私がデータベースを構築するための最良の方法を把握しようとしている言われて

enter image description here

。あなたは彼らがuser_idを外部キーとの記事と人との関係ですが、私も場所との間の関係を構築する必要が見ることができるように

**Posts** 
id 
title 
datetime 
content 
author_id 

**People** 
id 
firstname 
lastname 

**Places** 
id 
name 
lon 
lat 

:これは私がこれまでのところ、私の頭の中に持っているスキーマです投稿と人物、しかし私はデータが繰り返されることを望んでいません。ロンドンに2度DBを保管させてください。

私はリンカテーブルをやっていると思っていましたが、人のIDと投稿が同じである可能性があるので、面倒なことがあります。

誰もそのようなアプリを構築するためのアドバイスやベストプラクティスを提供できますか? http://www.touristeye.com/London-p-1066

おかげ

+0

人と投稿の両方の場所への参照を追加するのはどうですか。私はそれを読むと、あなたは投稿から場所へと多対1の関係を持ち、人々に投稿したいと思っていますか?注意してください。ちょうど一貫性のために、名前を付けてください! – aweis

+0

2番目のコメントは、ある場所の近くで他のものを検索したいので、私は空間データベースを調べるべきだと思います。そのような種類のデータに対して最適化されているからです。 – aweis

+0

場所に複数の投稿と人が含まれていることがありますので、多少の関係になることがあります。 – Cameron

答えて

0

私はあなたの場所のテーブルだと思います:それはのような人々がどのようにわからない場所を構築するためにしばらく時間がかかるだろうと

は私も場所のテーブル内のすべてのデータを保存することがすべきそうではありません。たとえば、ニューヨークのような場所には独自の緯度/経度があることが示唆されています。これはアプリケーションによってはデータを分析するのに賢明な方法ですが、自分のものではない可能性があります。投稿の緯度と経度の属性を作成し、場所と投稿の関係を他の方法でモデル化することをおすすめします。次に、プレイスが占める領域のアイディアを記録するのに必要な属性を保持するためにプレイスを修正します。多分単純なポリゴン、おそらくもっと複雑なものでしょう。

Placeの単純な考え方、つまりすべての緯度/経度のタプルがただ1つの場所(ロンドンなど)にあり、場所間に興味深い関係がないことがわかっている場合(例:Westminsterがロンドンの内側にある場合)外部キーによる場所と投稿の関係をモデル化します。しかし、これは、プレイス内のすべての投稿に同じlat/longタプルが与えられていることを意味します。

おそらく、空間データベースに近づくものを実装するつもりはない(あるいはそうする必要があります)ので、プレイスの再モデリングを妨げないようにしてください。

EDITコメント

後にそれはデータの重複は悪いことだ "考えるのは、あまりにも簡単です。1つは、私はあなたがデータを複製しているとは思わない、別の理由であなた(またはデータベースを設計している他の誰か)が望む理由がある。大まかに言えば、これらの理由はクエリのパフォーマンスに関係しています。しかし、あなたの問題に回してください:

投稿される場所は場所と同じではないと思います。あなたが書いたものから、例えば、100フィート離れたポストの緯度/経度を記録しますが、それらを同じ場所に結び付けます(私はタイムズスクエアが100フィート以上あることを推測しています)。 Placeの単純な概念がある場合は、外部キーを使用して関係を実装できます。しかし、Placeの定義は、緯度/経度で、その中から作られたPostの位置とは無関係です。 Times Sqで作成されたすべての投稿が同じ緯度/経度を持つように強制した場合、情報を失うことになります。

また、情報を失うことは、データベースには関係のない悪いことのひとつです(当然の理由がない限り)。

+0

地図上にその場所を表示したいので、かなり正確なデータが必要です。タイムズスクエア、NY、米国。しかし、もし私がポストテーブル自体にポストのlongとlatを格納しているのであれば、そこにもデータを作成しない限り、それをplacesテーブルにリンクする方法はありますか?しかし、どのように私は複製を停止するのですか... – Cameron

+0

DBスキーマは、投稿が長い/緯度を記録し、ユーザーがその投稿のリンクをクリックして他の投稿がどこにあるのかを示すことができると思う投稿を投稿できますかその領域... – Cameron

+0

「リンクをクリックしてください」は純粋なUIです。 UIがDBデザインに与える影響はUIデザインに依存しますが、私はあなたがその面でどのようなことを計画しているのか分かりません。私はあなたの要件が明確ではないと思うので、あなたのプレイスのデータ構造の設計をさらに助けることはできません。最後に、このDBを空白の紙からデザインするのではなく、既存のジオ対応DBを使用しています。より多くの支援が必要な場合は、それらのドキュメントの一部を参照してください(MySQLとPostGRESの両方に空間的な拡張があり、オンラインで十分に文書化されています)。 –

関連する問題