2

すべてのテーブルがテーブルで表される 1 つの基本型 (オブジェクト) から継承されるように、MySQL 内で継承データベース モデルを構築する作業を行っていobjectます。これにより、参照整合性を維持しながら、Notes をデータベース内の任意のテーブルの任意のオブジェクトにリンクできます。設計は次のようになります (同様の構造を持つ子テーブルは他にもたくさんあります)。

CREATE TABLE object
(
object_id INT(10) AUTO_INCREMENT,
object_type VARCHAR(80),
PRIMARY KEY (object_id)
);

CREATE TABLE person
(
person_id INT(10),
name_first VARCHAR(80),
name_last VARCHAR(80),
email_address VARCHAR(80),
PRIMARY KEY (person_id),
CONSTRAINT fk_person FOREIGN KEY (person_id)
REFERENCES object (object_id)
);

CREATE TABLE note
(
note_id INT(10),
not_text TEXT,
note_subject_id INT(10),
PRIMARY KEY (note_id),
CONSTRAINT fk_note FOREIGN KEY (note_id)
REFERENCES object (object_id),
CONSTRAINT fk_note_subject FOREIGN KEY (note_subject_id)
REFERENCES object (object_id)
);

この設計により、人を主題とするメモ、別のメモを主題とするメモ、または object から継承した他の多くのテーブルの 1 つを主題とするメモを作成できます (これらのテーブルは、簡潔)。参照整合性によって強制することはできませんが、この設計の前提として、各 object_id は 1 つの子テーブルの 1 つの行でのみ使用されるため、note_id が person_id であるメモはありません。

INSERT... SELECTperson または note に対してステートメントを実行したいときに問題が発生しますuserテーブルがあり、すべてのユーザーをに挿入したいとしましょうperson。まず、person作成している新しい行数を に挿入しobject、次に新しい行を に挿入する必要がありますが、person_id 列を設定するために各行を行にperson一致させる方法がありません。userobject

私が最初に考えたのは、新しいレコードを作成し、それに応じて値を更新するBEFORE INSERT TRIGGERonを作成することでした。残念ながら、外部キー制約は、トリガーの起動が許可される前に評価され、孤立した行を修正する前にキャッチしてしまいます。 personobjectNEW.person_id

私が探しているのは、BEFORE INSERT トリガーが制約に先行するように制約実行の順序を変更する方法、または MySQL 内でクラス テーブル継承データベース構造を実現するより洗練された方法のいずれかです。

4

1 に答える 1

0

これはオブジェクト指向ではなく、RDBMSに継承を実装したいだけです。水平マッピング、垂直マッピング、フィルターマッピングの3つの選択肢があります。

参照: http: //modeling.sourceforge.net/UserGuide/design-inheritance.html

ただし、参照整合性について少しリラックスすれば、継承は必要ないかもしれません。Noteテーブルには、メモを追加するテーブルごとに1つずつ、複数のnull許容外部キーが含まれている場合があります。

于 2012-02-03T10:08:35.680 に答える