2

我正在努力在 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的note。

当我想INSERT... SELECT对 person 或 note 执行语句时,就会出现问题。假设我有一个user表,我想将所有用户插入到person. 首先,我必须将person要创建的新行数插入object,然后我需要将新行插入person,但我无法将每一user行与object一行匹配以填充 person_id 列。

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

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

4

1 回答 1

0

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

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

不过,如果您对引用完整性稍有放松,您可能不需要继承。您的 Note 表可能包含多个可为空的外键,每个表对应一个您要添加注释的表。

于 2012-02-03T10:08:35.680 回答