我正在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中实现类表继承数据库结构。
答案 0 :(得分:0)
这不是面向对象,您只想在RDBMS中实现继承。您有三种选择:水平映射,垂直映射,过滤映射。
参考:http://modeling.sourceforge.net/UserGuide/design-inheritance.html
如果您对参考完整性略微放松,您可能不需要继承。您的Note表可能包含多个可以为空的外键,每个表对应要添加注释的表。