#database #inheritance
#База данных #наследование
Вопрос:
У меня есть базовая схема обобщения в базе данных, у меня есть суперкласс vehicle и его подклассы автомобили, мотоциклы. Я реализовал их, создав таблицу для каждой комбинации суперклассов / подклассов, таким образом, я создал таблицы автомобилей и мотоциклов.
Но теперь у меня проблема, мне нужно установить FK из моей другой таблицы на «обе» эти таблицы. Итак, у «Человека» есть либо мотоцикл, либо автомобиль, но никогда оба и никогда больше из одного вида. Как я могу связать табличных пользователей с автомобилями и мотоциклами для достижения этой цели? Большое вам спасибо.
Ответ №1:
Не делайте этого так — это просто приведет к боли и множеству дорогостоящих соединений.
Имейте одну таблицу для всей иерархии классов и столбец «дискриминатор», который определяет тип либо численно, либо символически. Краткий пример использования psuedo-sql:
create table machine {
machine_id int auto_increment,
machine_type char(1), -- can be 'a' for auto or 'm' for motorcyle,
make varchar(255),
model varchar(255),
auto_specific_field varchar(10) null,
moto_specific_field varchar(10) null
}
Ответ №2:
Возможно, вы могли бы сделать это с помощью ограничения проверки или хранимой процедуры (конкретные детали реализации зависят от вашей СУБД).
Но я думаю, вам следует переосмыслить свою общую архитектуру. Наследование — это концепция OO и, очевидно, должно быть реализовано клиентским кодом, а не базой данных. Базы данных (по крайней мере, реляционные) не предназначены для обработки таких вещей, и у них это плохо получается. Вы излишне усложняете свою жизнь (и открываете дверь для многих труднодоступных ошибок), когда вы все равно это делаете…
HTH!