类表继承(CTI)和插入选择语句

时间:2012-02-02 18:51:41

标签: mysql sql inheritance class-table-inheritance

我正在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_id只在一个子表的一行中使用,因此没有note_id也是person_id的注释。

当我想在个人或笔记上执行INSERT... SELECT声明时,会出现问题。假设我有一个user表,我想将所有用户插入person。首先,我必须将我创建的新person行的数量插入object,然后我需要将新行插入person,但我无法匹配每个user 1}}行到object行以填充person_id列。

我的第一个想法是在BEFORE INSERT TRIGGER上创建person,以创建新的object记录并相应地更新NEW.person_id值。不幸的是,在允许触发器触发之前正在评估外键约束,在我可以纠正它之前捕获我的孤立行。

我正在寻找的是改变约束执行顺序的方法,以便BEFORE INSERT触发器在约束之前,或者以更优雅的方式在MySQL中实现类表继承数据库结构。

1 个答案:

答案 0 :(得分:0)

这不是面向对象,您只想在RDBMS中实现继承。您有三种选择:水平映射,垂直映射,过滤映射。

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

如果您对参考完整性略微放松,您可能不需要继承。您的Note表可能包含多个可以为空的外键,每个表对应要添加注释的表。