Исходя из постановки задачи
----
all->brand->categories->type
all->type->categories->brand
----
это, IMHO, вообще никакое не дерево.
Ибо определить заранее парента невозможно. Все эти *свойства* товара (brand, categories, type) одноуровневые и не связаны иерархическими взаимосвязями. Следовательно, в таблице можно так и указать:
id, name, ..., brand, categories, type
Ну, а разные иерархии -- это уже *способ представления* данных, а не формат хранения.
Дерево можно формировать из простого селекта типа такого:
select * from goo
order by brand, categories, type;
Последовательно перебирая уже отсортированную таблицу, можно реагировать на изменение brand, categories или type и создавать новый узел соответствующего уровня. Если есть проблемы со скоростью, то результат разбора можно закешировать. Соответственно, разные результаты разных запросов надо кешировать в разные места...
