すべてのテーブルがテーブルで表される 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... SELECT
person または note に対してステートメントを実行したいときに問題が発生します。user
テーブルがあり、すべてのユーザーをに挿入したいとしましょうperson
。まず、person
作成している新しい行数を に挿入しobject
、次に新しい行を に挿入する必要がありますが、person_id 列を設定するために各行を行にperson
一致させる方法がありません。user
object
私が最初に考えたのは、新しいレコードを作成し、それに応じて値を更新するBEFORE INSERT TRIGGER
onを作成することでした。残念ながら、外部キー制約は、トリガーの起動が許可される前に評価され、孤立した行を修正する前にキャッチしてしまいます。 person
object
NEW.person_id
私が探しているのは、BEFORE INSERT トリガーが制約に先行するように制約実行の順序を変更する方法、または MySQL 内でクラス テーブル継承データベース構造を実現するより洗練された方法のいずれかです。