Вместо дополнительных таблиц под каждый тип можно создавать дополнительные столбцы.
entity_id # INT, ссылка на объект, которому принадлежит свойство
attribute_id # INT, ссылка на инфу о свойстве
value_int # INT, значение целочисленное
value_varchar # VARCHAR, короткий текст
value_text # TEXT, длинный текст
value_whatever # и так далее: DATETIME, ENUM, DECIMAL
Так раньше было сделано в Битриксе, например (как сейчас не знаю). При таком подходе мы можем собрать свойства отдельной энтити одним запросом (без юнионов), но таблица получается разреженной, большую часть значений составляют NULL-ы.
Отдельная таблица на тип создается,
например, в Magento (опять же надо проверить, но раньше было так, и вряд ли они радикально меняли схему). Можете посмотреть, какие запросы генерирует их ORM.
Ну и вообще поковыряйте разные e-commerce продукты, EAV в каком-то виде реализован у всех.
Если вас пугает именно
написание джойнов - зря пугаетесь, один фиг завернете их в какой-то API, потому что писать такое руками - утомительно и ведет к ошибкам.
Если вас пугает производительность схемы - ну, в идеале надо тестировать на ваших данных с вашими сценариями. Если лень или пока нет ни данных, ни сценариев ;) погуглите бандл / модуль для своего фреймворка и пляшите от него.