Плагины в оперденях.

Есть некоторая опердень. В ней есть:
* сущности "объекты"
* объекты группируются в группы
* объекты имеют связи с другой частью систеым, допустим, номером заказа
* объекты разнотипные, это означает, что помимо общей информации о объекте (ID, связь с группой, номер заказа), есть зависимые от атрибута типы
* добавление новых типых объектов должно быть оформлено в виде плагинов
* у каждого типа объекта есть так называемый "главный отображемый атрибут". Когда пользователь просматривает список всех объектов, он видит общие атрибуты, тип объекта, и этот самый главный отображаемый атрибут. Данный атрибут является как бы "ключом" объектов этого типа данных с точки зрения пользователя. Например, госномер автомобиля, или номер контейнера.
Перебираю варианты базы, все не нравятся. Хочу услышать "за" и "против" описанных мною, а также ваши предложения.
Рассмотрим следующую операцию: получить список всех объектов - т.е. все основные атрибуты объекта, а также "главный отображаемый атрибут"
Все решения имеют общую часть:
* Сделать таблицу со всеми основными атрибутами объектов
* Построить связи с таблицами:
1) "группы" (многие-к-одной)
2) "заказы" (один-к-одному).
Дальше начинаются вопросы "как представлять тип объекта" и "как связывать общие атрибуты и дополнительные атрибуты, зависимые от типа".
Окей, думаю, сделаем ObjectType = ENUM( car, container ) и колонку этого типа данных, положим её в таблицу "объекты", а также ID таблицы car или container в зависимости от колоник типа ObjectType.
В чём проблемы?
1) Получение списка всех объектов с колонкой "главный отображаемый атрибут" (пусть он строка, либо кастуется в строку). Получается мне нужно делать столько джойнов, сколько у меня типов. Т.е. что-то типа
select group,orderNumber from object inner join (select main from car) where car.id = object.externalId
union all
select group,orderNumber from object inner join (select main from car) where car.id = object.externalId
Ну или
select group,orderNumber from object inner join ((select id,main,CAR as objectType from car) union all (select id,main,CONTAINER from container)) as all
where all.id = object.externalId and all.objectType = object.objectType;
Хреново как-то.
2) Расширяемость. Добавляю я новый плагин - придётся модифицировать этот тип enum.
По-моему, такая операция потребует перестроить таблицу (если postgres такое вообще позволяет делать).
И как при подключении нового типа объектов изменить запрос из пункта (1)? Дописывать query?
Не, ну можно попарно группировать ((object и car) и container), где каждую пару представлять отдельной view... Но это же маразм.
Как решаются подобного сорта вопросы?
Дядьки вы умные, оперденей много разработали, вот как вы решаете такие проблемы?
P.S. плагины - требования к системе от заказчика. Послабление - используемые плагины выбираются при установке системы. Но лучше чтобы после установки и работы-хрен-знает сколько, можно было устанавливать новые плагины.