9

設定

そこで、STI (Single Table Inheritance) を使用することを決定した場合に、かなり一般的であることがわかっているシナリオを次に示します。

さまざまなサブタイプを持つ基本タイプがあります。

  • 人 < (教師、学生、スタッフなど)
  • ユーザー < (メンバー、管理者)
  • 会員 < (買い手、売り手)
  • 乗り物 < (車、船、飛行機)

データベースでのモデル化には、主に 2 つのアプローチがあります。

  • 単一テーブルの継承
    • 型フィールドと多数の null 許容フィールドを持つ 1 つの大きなテーブル
  • クラス テーブルの継承
    • 共有 PK (子から親への FK) を持つ型ごとに 1 つのテーブル

STI にはいくつかの問題がありますが、Rails などのフレームワークでのサポートと同様に、作成する必要がある結合の数を削減する方法が気に入っていますが、関連する方法について問題が発生しています。サブクラス固有のテーブル。

例えば:

  • 資格認定は教師個人のみを参照する必要があります
  • プロファイルはメンバー ユーザーのみを参照する必要があります
  • WingInformation は、車やボートに関連するものであってはなりません (あなたがバットマンでない限り)
  • 広告は、バイヤーメンバーではなくセラーメンバーが所有しています

CTI を使用すると、これらの関係は単純です。関連するテーブルに外部キーを平手打ちするだけで完了です。

ALTER TABLE advertisements
 ADD FOREIGN KEY (seller_id) REFERENCES sellers (id)

しかし、STI では、同様のことでサブタイプの制限を捉えることができません。

ALTER TABLE advertisements
  ADD FOREIGN KEY (seller_id) REFERENCES members (id)

私が見たいのは次のようなものです:

* Does not work in most (all?) databases *
ALTER TABLE advertisements
  ADD FOREIGN KEY (seller_id, 'seller') REFERENCES members (id, type)

私が見つけることができたのは、関連するテーブルに計算列を追加する必要がある汚いハックだけです。

ALTER TABLE advertisements
  ADD seller_type VARCHAR(20) NOT NULL DEFAULT 'seller'
ALTER TABLE advertisements
  FOREIGN KEY (seller_id, seller-type) REFERENCES members (id, type)

これは奇妙に思えます (エレガントでないことは言うまでもありません)。

本当の質問

これを可能にする RDBMS はありますか?

これが不可能な理由はありますか?

これは、最も些細な場合を除いて STI を使用しないもう 1 つの理由ですか?

4

1 に答える 1

5

外部キー宣言で定数を宣言する標準的な方法はありません。列に名前を付ける必要があります。

ただし、次のいずれかの方法を使用して、列に固定値を強制することができます。

  • 計算列

  • CHECK 制約

  • INSERT/UPDATE の前にトリガーして、ユーザー指定の値をデフォルト値で上書きします。

于 2012-11-25T18:36:04.813 に答える