我正在努力在MySQL中构建一个继承数据库模型,使所有表从一个基类型(对象)继承,由object
表代表。这使得Notes可以链接到数据库中任何表的任何对象,同时保持参照完整性。设计看起来像这样(有结构相似的多了很多的子表):类表继承(CTI)和插入选择语句
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只用于一个子表的一行,因此没有note_id也是person_id。
当我想要执行INSERT... SELECT
声明或注释时,会发生此问题。假设我有一个user
表,我想插入所有用户到person
。首先,我必须将我创建的新行数person
插入object
,然后我需要将新行插入person
,但我无法将每个user
行匹配到object
行以填充person_id列。
我首先想到的是要建立一个BEFORE INSERT TRIGGER
上person
将创造新的纪录object
并相应地更新NEW.person_id
值。不幸的是,在触发器被允许触发之前,外键约束被评估,在我能纠正它之前捕捉到我的孤行。
我正在寻找的是要么改变约束执行的顺序,以便BEFORE INSERT触发器先于约束,或者更优雅的方式来实现MySQL中的类表继承数据库结构。
大声笑...看起来兄弟,你试图为自己的善良太复杂。我会放弃这个实现,并在我需要的每个表中添加一个“注释”列。 – alfasin 2012-02-02 18:55:15
不幸的是,笔记不是我需要继承的唯一对象。我知道这是一个复杂的模型,但我不认为数据库继承是如此复杂,它应该完全放弃... – therealmitchconnors 2012-02-03 16:36:51
因此,您可以将共享属性分组到具有两个外键的属性表中,而不是继承:对象的外部标识以及另一个表示对象驻留在哪个表中的外部标识。 – alfasin 2012-02-03 17:01:09