gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:43:57 24 4
gpt4 key购买 nike

我正致力于在 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 行与 object 行匹配以填充 person_id 列。

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

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

最佳答案

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

引用:http://modeling.sourceforge.net/UserGuide/design-inheritance.html

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

关于mysql - 类表继承 (CTI) 和插入选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9118165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com