2012-02-02 8 views
3

私は、すべてのテーブルが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 TRIGGERpersonに作成して、新しいobjectレコードを作成し、それに応じてNEW.person_idの値を更新するというのが最初の考えでした。残念ながら、トリガーが起動する前に外部キー制約が評価されていて、孤立した行を修正する前にキャッチしています。

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

+3

Lol ... look brother、あなたは自分のために洗練されていないようにしようとしました。私はこの実装を落として、必要なすべてのテーブルに「メモ」列を追加するだけです。 – alfasin

+0

残念ながら、メモは私が継承する必要がある唯一のオブジェクトではありません。私はこれが複雑なモデルであることは知っていますが、データベース継承はとても複雑であるとは思われませんでした。 – therealmitchconnors

+0

継承の代わりに、共有プロパティを2つの外部キーを持つプロパティテーブルにグループ化できます。オブジェクトの外部IDと、オブジェクトが存在するテーブルを示す別のIDです。 – alfasin

答えて

1

これはオブジェクトの方向ではなく、RDBMSに継承を実装したいだけです。 Horizo​​ntal Mapping、Vertical Mapping、Filtered Mappingの3つの選択肢があります。

参考:あなたは、参照整合性に少しリラックス場合は、しかし、継承を必要としないかもしれないhttp://modeling.sourceforge.net/UserGuide/design-inheritance.html

。 Noteテーブルには、複数のNULL可能な外部キーが含まれています.1つは、メモを追加するテーブルごとです。

+0

私はこのデザインがあなたのリンクの垂直マッピングに準拠していることを確信しています...複数のオブジェクトタイプに適用する必要があるだけでなく、継承を放棄することは私の選択肢ではありません... – therealmitchconnors

関連する問題