3

「コメント」というテーブルがあります。テーブルをデータベース内の他のテーブルに関連付けることができるようにします。たとえば、「users」、「projects」、「tasks」というテーブルがあったとします。これらのテーブルの任意の行にコメントを関連付けることができるようにしたいと考えています。

私の現在の解決策は、「id」、「comment_id」、「foreign_table」、「foreign_table_id」の 4 つの列を持つ「comments_relations」という単一のテーブルです。これはうまく機能しますが、致命的な問題が 1 つあります。「コメント」テーブルは実際には他のテーブルとは関係がないため、外部キーの利点がまったく得られません。プロジェクトが削除されると、関連するすべてのコメントも削除されます。ユーザーとタスク、および追加する将来のテーブルについても同様です。

私の経験では、実際の解決策は 2 つしか思い浮かびません (私の意見ではどちらも悪いと思います)。

  1. 「user_id」、「project_id」、「task_id」など、関連するすべてのテーブルの「comments」テーブルに null 許容列を追加します。これらすべての列に外部キーを定義して、必要な動作を得ることができます。しかし、コメントが必要なテーブルが 10 個ある日はどうでしょうか? そして20?これは非常にスケーラブルなソリューションではないと思います。
  2. 各テーブルをコメントテーブルにリンクする、たとえば「users_comments」、「projects_comments」など、関連するテーブルごとに別のテーブルを追加します。これにより、「コメント」テーブルがきれいに保たれますが、データベース内のテーブルの量がほぼ 2 倍になります。また、他のテーブルに関連付け可能な別のテーブルを追加するとどうなるでしょうか? これはスケーリングしません。

理想的なソリューションは、私が現在使用しているソリューションですが、外部キーの機能を付与するために何らかの形で強化されています。

要約された質問:

任意の量の他のテーブルに関連付けることができるテーブルを定義する最もスケーラブルな方法は何ですか?

4

2 に答える 2

0

大声で考えて、1 つのコメントテーブルを維持したいと仮定しますが、各テーブルに ID を割り当てるのはどうでしょうか。このようなもの:

ID  |  table_name
-----------------
 1  |  users
 2  |  projects
 3  |  tasks

次に、コメント テーブルに、テーブル ID の列と、ユーザー/プロジェクト/タスク データの特定の行 ID があります。

ID  |  table_id  |  data_id  |  comment
---------------------------------------------------
 1  |     1      |    468    |  yadda yadda yadda
 2  |     2      |    915    |  yadda yadda yadda
 3  |     1      |    195    |  yadda yadda yadda
 4  |     3      |    731    |  yadda yadda yadda
 5  |     1      |     5     |  yadda yadda yadda

最初の関連付けテーブルを設定するには多少のオーバーヘッドがありますが、テーブルの追加/削除は動的ではない傾向があるため、それがひどいことにはなりません。

于 2013-04-12T23:03:57.450 に答える