Наследование таблиц классов (CTI) и операторы Select Select - PullRequest
2 голосов
/ 02 февраля 2012

Я работаю над созданием модели базы данных наследования в 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.

1 Ответ

0 голосов
/ 03 февраля 2012

Это не объектная ориентация, вы просто хотите реализовать наследование в вашей СУБД. У вас есть три варианта: горизонтальное отображение, вертикальное отображение, фильтрованное отображение.

Ссылка: http://modeling.sourceforge.net/UserGuide/design-inheritance.html

Возможно, вам не понадобится наследование, если вы немного расслабитесь из-за целостности ссылок. Ваша таблица заметок может содержать несколько внешних ключей, допускающих значение NULL, по одному для каждой таблицы, к которой вы хотите добавить заметку.

...