2

DB 内のテーブルによってそれぞれが表される 2 つ以上の大きく異なるオブジェクトがあるとします。これらを Article、Book などと呼びます。ここで、これらの各オブジェクトにコメント機能を追加したいとします。コメントは各オブジェクトでまったく同じように動作するため、理想的には 1 つのテーブルで表現したいと考えています。

しかし、私はこれを行う良い方法を知りません。私がこれを行う方法を知っている方法は次のとおりです。

  • オブジェクトごとにコメント テーブルを作成します。Article_comments、Book_comments なども同様です。それぞれに、適切なオブジェクトへの外部キー列があります。
  • 1 つのグローバル コメント テーブルを作成します。「Book」または「Article」を参照する comment_type を用意します。オブジェクトごとにヌル可能な外部キー列を持ち、comment_type を使用して使用する外部キーを決定します。

上記のいずれの方法でも、新しいオブジェクトが追加されるたびにモデル/データベースの更新が必要になります。より良い方法はありますか?

4

2 に答える 2

0

私は個人的にあなたの最初のオプションが最善だと思います、しかし私はスタイルポイントのためにこのオプションを投げます:

コメントは自然な構造になっています。最初のコメントがあります。おそらくコメントについてのコメントです。本当にコメントの木です。

コメントツリーのルートを指す各オブジェクトに1つのフィールドを追加した場合はどうなりますか。次に、「記事123のコメントツリーを取得します。」と言うと、ルートを取得して、1つのコメントテーブルに基づいてツリーを構築できます。

注:私はまだオプション1が一番好きです。=)

于 2013-01-18T23:02:16.090 に答える
0

もう1つの戦略があります。1つの共通テーブルから1つの異なる種類の「コメント可能な」オブジェクトを継承し、コメントをそのテーブルに接続します。

ここに画像の説明を入力

3 つの戦略はすべて有効で、長所と短所があります。

  1. 個別のコメント テーブルはクリーンですが、DML と場合によってはクライアント コードで繰り返しが必要です。また、なんらかの形式の継承を使用しない限り、それらに共通のキーを強制することは不可能です。これにより、そもそも (3) に直行しないのはなぜでしょうか?
  2. 複数の FK を持つ 1 つのコメント テーブルには多くの NULL があり (ストレージやキャッシュに関して問題がある場合とない場合があります)、新しい種類の「コメント可能な」オブジェクトが追加されるたびに、コメント テーブルに新しい列を追加する必要があります。データベース。ところで、必ずしも必要ではありません-どのフィールドが非NULLであるかから推測comment_typeできます。
  3. 継承は現在のリレーショナル DBMS では直接サポートされていないため、独自のエンジニアリング トレードオフが発生します。良い面としては、モデルの残りの部分を変更することなく、新しい種類のコメント可能なオブジェクトを簡単に追加できる可能性があります。

1あか。カテゴリ、サブクラス化、汎化階層... 継承の詳細については、ERwin Methods Guideの「サブタイプの関係」セクションを参照してください。

于 2013-01-18T23:42:16.047 に答える