1

抽象基本クラスと、その基本クラスから継承する 5 ~ 6 個のクラスを持つオブジェクト モデルがあります。それらを格納するための適切なリレーショナル データ モデルを設計したいと考えています。データモデルを設計する最良の方法は何ですか?

送信されたメッセージを追跡する架空のアプリケーションの簡単な例を次に示します。

メッセージ(基底クラス)

  • 長いID
  • 作成日
  • 文字列テキスト

EmailMessage (メッセージを拡張)

  • 文字列の受信者リスト

PhoneMessage (メッセージを拡張)

  • 文字列 phoneNumber

私は、 email_messagephone_messageの各テーブルにプライベート フィールドのみが含まれるクラスごとに個別のテーブルを作成する傾向があります。その優れた点は、オブジェクト モデルを反映し、関心事が明確に分離されていることです。悪い点は、データを 2 回ロードする必要があることです。1 回目は具象型を判別するため、もう 1 回は具象テーブルから残りのデータをロードするためです。

これは、満足のいく答えが見つからない非常に一般的な問題であることがわかりました。あなたのアドバイスに感謝します。あなたの経験は何ですか?ありがとう。

ピート

4

1 に答える 1

1

これを行うにはさまざまな方法があり、選択はあなた次第です。これに対する一般的なソリューションは、単一テーブル継承 (STI)、クラス テーブル継承 (CTI) とも呼ばれる複数テーブル継承 (MTI)、および具象テーブル継承です。

STI では、親クラスのすべてのサブクラスのすべての列が 1 つのテーブルで定義されます。特定の列を使用しないクラスは、値を NULL として格納します。クラスの型は通常、追加の列に格納されます。

MTI では、すべてのスーパークラスの列が 1 つの親テーブルに格納され、サブクラスごとに個別のテーブルが一意のフィールドを保持します。サブクラス テーブルの外部キーは、親レコードにリンクします。

Concrete Table Inheritance はこれをさらに進め、サブクラスごとに完全に個別のテーブルを必要とします。

さまざまな方法を推奨する多くの記事があります。通常、STI は実装が最も簡単ですが、MTI/CTI は STI に固有の特定の問題を回避できます (必須の null 許容フィールドは一般的なものです)。

于 2013-02-11T22:36:30.017 に答える