編集:タイトルはかなり広いです。「ユーザーがコンテンツを投稿できるリレーショナル データベース設計に最適なソリューションであり、使用可能なフィールドはコンテンツの種類によって異なる」という方が正確です。
ユーザーがさまざまな種類のコンテンツを投稿できる Web サイトに取り組んでいます。すべての投稿には、テキストと、それを別のフィードに関連付ける feed_id 値があります (1 つのフィードへの多数の投稿)。一部の投稿にはテキストのみが含まれるという考えに基づいて、最善の解決策は何ですか?
これまでに考えたアイデア:
- 投稿を参照する特別なタイプごとにテーブルを追加し、参照されていない投稿はテキスト投稿のままにします。
問題: テキストのみの投稿はどのように照会されますか?
- テキスト投稿を含む各タイプの表を追加します。
問題: あまり効率的ではないようです。text_posts で見つかったすべての投稿について、テキスト フィールドを取得するには、post でその投稿を再度見つける必要があります。繰り返しますが、これは写真のような特殊なタイプの場合にすでに当てはまりました。JOINでこれを達成する適切な方法はありますか?
- null の可能性がある各特別なタイプへの各ポスト エントリの外部キー
問題: null フィールドが多く、ルールはアプリケーションで管理する必要があります。
- 投稿の種類を表すフィールド
短所: ルールはアプリケーションで維持する必要があります (大文字と小文字の区別、投稿は有効なタイプのみを持つ必要があります)、クエリを実行するのが難しい長所: このフィールドは、同様のコンテンツの異なるビューを表すこともできます (つまり、"blog_entry" という名前の post_type の値を作成できます)。これはテキスト投稿とまったく同じですが、アプリケーションにコンテンツを別の方法で表示させます)。ただし、このプロにはコードの匂いが少しあります...
また、違いがあれば、私のアプリケーションは PHP で書かれています。
編集:私の最初の解決策である「投稿を参照する特別なタイプごとにテーブルを追加し、参照されていない投稿をテキスト投稿のままにする」は、次のようにすべての投稿を照会するとうまくいくようです。
SELECT posts.title, posts.text, picture_posts.id, picture_posts.src FROM posts
LEFT JOIN picture_posts
ON picture_posts.post_id=posts.id
ORDER BY posts.date DESC
そして、アプリケーションの擬似コードは次のようになります。
print(posts.title, posts.text);
if (picture_posts.id is not null) {
showPicture(picture_posts.src);
}
このデザインを使用する必要がありますか?