私は、すべてのテーブルがobject
テーブルで表される1つの基本型(オブジェクト)を継承するように、MySQL内に継承データベースモデルを構築するよう努めています。これにより、参照整合性を保持したまま、データベース内の任意のテーブルの任意のオブジェクトにNotesをリンクすることができます。私は別のノートのようにして、被写体である人物との注記をメモしておくことが可能です、この設計ではクラステーブル継承(CTI)とInsert Selectステートメント
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_idが1つの子テーブルの1行でのみ使用されるため、note_idもperson_idである注釈がないことです。
INSERT... SELECT
人の声明または注釈を実行するときに問題が発生します。 user
テーブルがあり、すべてのユーザーをperson
に挿入したいとします。まず、新しいperson
の行をobject
に挿入する必要があります。新しい行をperson
に挿入する必要がありますが、object
の行に一致させる方法はありません。
BEFORE INSERT TRIGGER
をperson
に作成して、新しいobject
レコードを作成し、それに応じてNEW.person_id
の値を更新するというのが最初の考えでした。残念ながら、トリガーが起動する前に外部キー制約が評価されていて、孤立した行を修正する前にキャッチしています。
私が探しているのは、BEFORE INSERTトリガーが制約に先行するように制約の実行順序を変更する方法、またはMySQL内のクラステーブル継承データベース構造を実現するより洗練された方法です。
Lol ... look brother、あなたは自分のために洗練されていないようにしようとしました。私はこの実装を落として、必要なすべてのテーブルに「メモ」列を追加するだけです。 – alfasin
残念ながら、メモは私が継承する必要がある唯一のオブジェクトではありません。私はこれが複雑なモデルであることは知っていますが、データベース継承はとても複雑であるとは思われませんでした。 – therealmitchconnors
継承の代わりに、共有プロパティを2つの外部キーを持つプロパティテーブルにグループ化できます。オブジェクトの外部IDと、オブジェクトが存在するテーブルを示す別のIDです。 – alfasin