Я обычно моделирую это с помощью чего-то похожего на наследование в объектно-ориентированном языке. Это будет выглядеть примерно так:
Products
id (PK)
Widgets
product_id (FK to Products.id) (PK)
<widget specific columns>
Whatsits
product_id (FK to Products.id) (PK)
Product_Types
type_id
product_id (FK to Products.id)
Таким образом, вы можете связать типы продуктов с любым подтипом продукта.
Ваш дизайн звучит немного "слабоумно", но, возможно, это потому, что вы просто приводите пример. Я бы посоветовал узнать о модели EAV и почему вы должны избегать этого. Я не могу сказать, используете ли вы этот шаблон или нет, но похоже, что вы могли бы.