【发布时间】:2012-02-02 18:51:41
【问题描述】:
我正在努力在 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 语句时出现问题。假设我有一个user 表,我想将所有用户插入到person。首先我必须将我正在创建的新person 行数插入object,然后我需要将新行插入person,但我无法将每个user 行与@987654330 匹配@row 以填充 person_id 列。
我的第一个想法是在person 上创建一个BEFORE INSERT TRIGGER,这将创建新的object 记录并相应地更新NEW.person_id 值。不幸的是,外键约束在触发器被触发之前被评估,在我纠正它之前捕获了我的孤立行。
我正在寻找一种改变约束执行顺序的方法,以便 BEFORE INSERT 触发器优先于约束,或者寻找一种更优雅的方法来在 MySQL 中实现类表继承数据库结构。
【问题讨论】:
-
大声笑...看兄弟,你为了你自己的利益试图太老练。我会放弃这个实现,只在我需要的每个表中添加一个“注释”列。
-
不幸的是,笔记并不是我需要继承的唯一对象。我知道这是一个复杂的模型,但我不认为数据库继承如此复杂,应该完全放弃......
-
因此,您可以使用两个外键将共享属性分组到一个属性表中,而不是继承:一个提供对象的外部 ID,另一个说明对象驻留在哪个表中。class="comcopy">跨度>
-
如果您建议外部 ID 列指向属性所针对的任何表的主键,这将无法通过参照完整性强制执行,这将导致比解决的问题更多的问题。
-
为什么不呢?您打算为表格添加/删除列吗?
标签: mysql sql inheritance class-table-inheritance