2017-10-20 3 views
0

私はSQLとDBMSを初めて使用しているので、ベストプラクティスを学び、可能なことと不可能なことを模索しています。私はPostgresにデータベースを設計しました。これは6つのテーブルを含みます:SATELLITE DATA CROP DATAの外部キーを持つFATを持つFKを持つFKを持つ外部データを持つ衛星データ。MET STATIONとMET DATAの外部キーを持つFARMSもあります。 MET STATIONとの外部キー。 (私はそれを説明したことを願っています..)PK/FKによって直接リンクされていないが、複数の他のテーブルを介してリンクされている2つのテーブルからデータを出力するSQLクエリ?

私は、全部でリンクがあったので、互いに最も離れた2つのテーブル(SATELLITE DATAとMET DATA)からの情報を含む出力テーブルを取得できると仮定していましたPKsとFKsを介して他のテーブル..しかし、私はそうするSQLを働くことはできません。 (私はそれを行うには非常に長いSQLを想定することができますが、可能ならばより効率的な方法があります..)

私の質問は次のとおりです。私がやったのと同じ設計のデータベースで効率的な方法を?または、リンクする必要がある各テーブルが、複数の他のテーブルではなく直接リンクされるように、データベースを再設計する必要がありますか?

ありがとうございました!

+1

あなたの質問に** [EDIT] **と[サンプルデータ](http://plaintexttools.github.io/plain-text-table/)とそのデータに基づいて予想される出力を追加してください。 [**書式設定されたテキスト**](http://stackoverflow.com/help/formatting)ください、[** noスクリーンショット**](http://meta.stackoverflow.com/questions/285551/why-may -i-not-upload-images-of-code-on-so-asking-a-question/285557#285557)。 ** [編集] **あなたの質問 - コメントを投稿するコードや追加情報はありません**。 –

+0

私はサンプルデータを入れようとしましたが、プレビューで面白い書式で貼り付けられたプレーンテキストテーブルは混乱しました。私はその説明が誰かが答えるのに十分だと思います - しかし、サンプルデータの欠如のために謝ります。 –

+0

http://stackoverflow.com/help/formatting –

答えて

0
select * 
from one t1 
join six t6 ON exists (
     select * 
     from two t2 
     join three t3 on t3.two_id = t2.two_id 
     join four t4 on t4.three_id = t3.three_id 
     join five t5 on t5.five_id = t4.five_id 
     where t2.one_id = t1.one_id 
     and t5.six_id = t6.six_id 
     ); 

今、あなただけ(あなたが提供しなかったことを)実際の名前で、テーブル/カラム名を交換する必要がある

+0

返信いただきありがとうございます。データが2つのテーブルから頻繁に呼び出されるので、PKとFKによって直接リンクされたMET DATAとSATELLITE DATAテーブルを持つ方がよいでしょうか?理論的にはストレージ要件が余分に必要なので、データストレージの観点からはより効率的な方法だと思うので、これが私が行ったようにデータベースを設計した理由です。 –

+0

"効率的"は、データベースモデリングでは異なる意味を持ちます。これはすべて、正しさとコンパクトさと制約の最小化に関するものです。 https://en.wikipedia.org/wiki/Database_normalization – joop

0

クエリは難しいことではありません。

select . . . 
from met_station ms join 
    farms f 
    on ms.farm_id =f.farm_id join 
    fields fi 
    on f.field_id = fi.field_id join 
    crops c 
    on c.crop_id = f.crop_id join 
    satellites s 
    on s.satellite_id = c.satellite_id; 

データモデルを正しく理解すると、これらはすべて1-nリレーションシップであり、ジョインを処理する際に問題はありません。あなたはそれらをリストアップするだけです。また、結合キーが主キー(1つの表内)であると仮定すると、パフォーマンスは良好でなければなりません。

テーブルの一部がn-mの場合、問題があります。そのような複数の関係を処理するには、参加する前に集約することがよくあります。

関連する問題