Я работаю над созданием модели базы данных наследования в 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.
Моей первой мыслью было создание BEFORE INSERT TRIGGER
для person
, которое создаст новую запись object
и обновит значение NEW.person_id
соответственно.К сожалению, ограничение внешнего ключа оценивается до того, как триггеру разрешено сработать, перехватывая мою потерянную строку, прежде чем я смогу ее исправить.
То, что я ищу, это либо способ изменить порядок выполнения ограничений, чтобы триггеры BEFORE INSERT предшествовали ограничениям, либо более элегантный способ достижения структуры базы данных наследования таблиц классов в MySQL.