Связывание наследования базы данных

#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!