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である必要もあります...
まあ、私はあらゆる種類のアイデアを公開しています。アプリケーションはまだ書かれていないので、基本的に好きなものは変更できます。
この質問は、ここで概説した範囲を超えていると思います。たとえば、あなたはすべてのテーブルをスキャンしたくないと言いました。それはテーブルシークとの比較ですか?エントリテーブルにはいくつの行がありますか?一度に1つのアイテムを要求した場合、いくつの通話を行うか。ここにはたくさんの要因がありますが、私はあなたにはメリットのある簡単な答えは得られないと思います。 (選択された回答者に違反することはありません) –