ユーザーが別のテーブルに保存されているコンテンツにコメントを投稿できるようにしたい場合、これを行うための最良の方法は何ですか?
コンテンツの種類ごとにコメント用の追加テーブルを作成する。例えば;
または、コメント用に 1 つのテーブルを使用し、複数の結合テーブルを使用します。例えば;
または、各テーブルの外部キーをコメント テーブルに追加するだけですか?
ユーザーが別のテーブルに保存されているコンテンツにコメントを投稿できるようにしたい場合、これを行うための最良の方法は何ですか?
コンテンツの種類ごとにコメント用の追加テーブルを作成する。例えば;
または、コメント用に 1 つのテーブルを使用し、複数の結合テーブルを使用します。例えば;
または、各テーブルの外部キーをコメント テーブルに追加するだけですか?
1つの「コメント」を複数のページ/投稿/user_profilesで共有するつもりはないため、最後のアプローチは完全に正規化されていません。これにより、データの異常と冗長性が可能になります。
最初のものはより正確で、またより高速です。
個人的にはもっと簡単なので、最初の方法でやります。ただし、2番目の設計に傾倒することになった場合は、「has_comments」テーブルは必要ありません。代わりに、コメントテーブルにfk列を配置し、コメントがページ、投稿などのタイプであるかどうかを保持するtype_idを持つ別の列を配置します。
各テーブルの外部キーを 1 つのコメント テーブルに追加するだけです。コメントが 3 つのそれぞれについて同じ形式である場合、長い目で見れば、作業がはるかに簡単になります。これは、コメント テーブルに null 許容の外部キーが必要になることを意味することに注意してください。
あなたが説明した最初のアプローチは、ページのコメントが投稿のコメントと異なる場合にのみ使用されます. それ以外の場合は、コメント テーブルを 1 つだけ持つ方がはるかに簡単です。
中央の表は、同じコメントを複数のページに投稿したい場合にのみ必要です (これはあなたが望んでいるとは思えません)。これは多対多の関係と呼ばれますが、1 対多の関係を説明しています (1 つのページ、投稿、またはプロファイルには多くのコメントを含めることができます)。
最初のオプションが正しいアプローチだと思います。2番目のアプローチは、正規化のための正規化の場合のように感じます。「2 番目のアプローチから何が得られるか」を自問してください。答えは、同じコメントをページ、投稿、および user_profile で共有することです。しかし、実際にはそれらはまったく同じではありません (おそらく、ページ コメント、投稿コメント、およびユーザー プロファイル コメントを別々に保存する必要があります)。だからあまり得しない。
外部キーを配置してオプション番号1を使用します。これにより、後々の手間が大幅に軽減されます。