12

多相関連(PA)は、比較的単純なデータベース要件のために非常に使いやすいです。さまざまなテーブルが1つの共有テーブルに複数の子レコードを持つようにします。古典的な例は、異なるものではない異種のエンティティに適用されるコメントレコードを持つ単一のテーブルです。既存のデータベースに多相関連を実装する方法

this questionマークは、PAを実装する3つの一般的なアプローチを示す優れた仕事をしました。ベーステーブルのアプローチを使用したいと思います。詳細についてはanswer by Bill Karwinで詳しく説明しています。

具体例は次のようになります

enter image description here

エンティティの主キーは、ベーステーブルとコメントテーブルに同一のキー値を参照するので、参照整合性、ベーステーブルを指します観察される。重要な部分は、エンティティテーブルの主キーにという別個のドメインがあることです。それらは、基底テーブルに新しいレコードを作成し、生成されたキーをエンティティの主キーにコピーすることによって生成されます。

私の質問相互に重複するプライマリキーを生成するエンティティを持つ既存のデータベースに参照整合性のあるPAを導入したいのですが?

オプション1:

Option 1

各エンティティは、独自の主キーを保持しますが、また別のキーを取得します

はこれまでのところ、私は2つのオプションを参照してください。

同様:推奨されるアプローチを閉じる

  • テーブルは安定しています。

嫌い:

  • 既存のエンティティを変更する必要があります。
  • コメントの所有エンティティを見つけることが難しい。

オプション2:

Option 2

各エンティティは、ベーステーブルの独自の外部キー列を有しています。これはMarkの複数列アプローチのようです。

同様:影響を受けません

  • 既存のエンティティ。
  • コメントの所有エンティティを簡単に見つけることができます。

嫌い:

  • スパース列
  • ベーステーブルがない安定した:PAで新しいエンティティが導入された変更を必要とする

私はフィールドで、おそらく、オプション1に傾きます双方向ルックアップのためのBaseテーブルの "EntityName"。 どちらのオプションが良いでしょうか。それとも別の、より良いアプローチですか?

+0

オプション1は、維持が容易であろう。ベーステーブルに列を追加し続ける必要がある場合、面倒であり、ページ分割やポインタなどのために多くのメンテナンスが必要になります。 – JNK

+0

@JNK良い点は、物理的なストレージの影響が重要であることに留意することです。 –

+0

オプション1を使用できますが、代理代替キーを使用することはできません。新しい代替キーは、 'EntityType'カラム(' CHAR(1) '、イベントの' E'、人物の 'P'、' D'のための '製品の場合) –

答えて

9

オプション1を使用できますが、代わりの代替代行キーは使用できません。代わりに

、(イベントのE、人のためにP、製品のDだろうと言うCHAR(1)、)EntityType欄で、(各エンティティの)既存の主キーを拡張します。

化合物(EntityId, EntityType)は、表Entityの主キーとなり、他の3つのサブタイプ表の対応する化合物になります。

EntityTypeは、3行のちょうどauxilary、参照テーブル、である):

Polymorphic_Associations

関連する問題