2010-12-30 15 views
0

SQLモデル/クエリ質問

alt text

1つのエントリは、タイプの複数のアイテム「ファイル」、「テキスト」と「URL」を持つことができます。

これらのアイテムの誰もが、テキスト、URL、またはファイルテーブルのいずれかに、データが格納されている正確に1つの対応するアイテムを持っています。

すべての対応するアイテムとそのデータを含むエントリを効率的に選択するためのクエリが必要です。

だから私の最初のアプローチは、

SELECT * FROM entries LEFT JOIN entries_items LEFT JOIN texts LEFT JOIN urls LEFT JOIN files 

のようにいろいろ書いたし、それをループし、私のアプリケーションでの後処理を行います。

しかし、事実は、異なるタイプの複数のアイテムが存在する可能性は非常に低いということです。 1つのエントリにつき1つ以上のアイテムが存在するというまれなケースです。ほとんどの場合、ファイルになります。しかし、私はそれを必要とする...

eveyrアイテムのために3つのテーブルをすべてスキャンしないでください。私はcase/switchのようなことができ、entries_itemsの "type"の値に基づいて対応するテーブルをスキャンできます。

しかし、私はそれを働かせることができませんでした。

また、アプリケーションのcase/switchロジックを作成することも考えましたが、mysqlサーバーが外部になるにつれて複数のクエリが発生する可能性があります。

もっと良いアプローチがあれば構造を変更することもできます。

「texts」、「urls」、および「files」のすべてのフィールドは、entries_itemsテーブルの横にあり、唯一の1:1の関係であり、必要のないすべてがnullになっています。 その賛否両論は何でしょうか?私はそれがより多くの記憶スペースを必要とし、私は今私が持っているので私のcosntraintsを行うことができないと思う。すべてがnullである必要もあります...

まあ、私はあらゆる種類のアイデアを公開しています。アプリケーションはまだ書かれていないので、基本的に好きなものは変更できます。

+0

この質問は、ここで概説した範囲を超えていると思います。たとえば、あなたはすべてのテーブルをスキャンしたくないと言いました。それはテーブルシークとの比較ですか?エントリテーブルにはいくつの行がありますか?一度に1つのアイテムを要求した場合、いくつの通話を行うか。ここにはたくさんの要因がありますが、私はあなたにはメリットのある簡単な答えは得られないと思います。 (選択された回答者に違反することはありません) –

答えて

1

仲介テーブルENTRIES_ITEMSを介してプライマリENTRIESテーブルにリンクされている3つの異なるエンティティタイプ(URL、TEXT、FILE)があり、この「条件付き結合」アプローチでは通常のフォームに違反しています。構造が与えられると、ENTRIES_ITEMS.idに外部キー制約を宣言することは不可能です。これは、id列がURLS、TEXTS、またはFILESテーブルを参照できるためです。 ENTRIES_ITEMSテーブルを正規化するには、urlid、textid、およびfileidの3つのフィールドを追加し、それらをヌル可能にする必要があります。次に、3つのエンティティテーブルのそれぞれをリンクテーブルを介してENTRIESテーブルに結合できます。あなたが取っているアプローチは、SQLセレクトを使用して宣言的にではなくエンティティ・テーブルから値をプログラム/プロシージャルで取得したSQL92準拠ではないレガシー・データベースでよく見られます。

+0

3つの異なるidフィールドは良いアイデアのように聞こえる! –

1

まず、「entries_items」テーブルに、テキスト、URL、およびファイルのXML表現を含む列を追加することを検討します。私はMySQLについて話すことはできませんが、SQL ServerにはXMLを処理するための素晴らしい機能があります。私はMySQLもそうだと思う。

このような最先端の技術ではない場合、私はすでに考えているように、レトロになり、多数のヌルを持つ1つのアイテムテーブルを持つことを検討します。

+0

うわー、確かにそれをチェックしてください!確かに、私はより古典的なSQLソリューションを好むでしょう。 –

1

これはあなたには役立つかもしれませんが、entriesentries_itemsという階層構造(parent_id)は解決されません。

select * 
from entries  as e 
join entries_items as i on i.entry_id = e.id 
left join texts as t on t.item_id = i.id and i.type = 'text' 
left join urls  as u on u.item_id = i.id and i.type = 'url' 
left join files as f on f.file_id = i.id and i.type = 'file' 
; 

モデルのクリーンアップを考慮すると、これが出発点になります。

alt text

+0

これは私が今いるもののように私に見えるが、参加条件に感謝する;) –