Podés tener una tabla donde haya un registro por cada relación A pertenece a B, ej:
parent | child
---------------------|----------------------
indumentaria(id: 1) | calzados(id: 2)
indumentaria(id: 1) | para la mujer(id: 3)
indumentaria(id: 1) | botas(id: 4)
calzados(id: 2) | para la mujer(id: 3)
calzados(id: 2) | botas(id: 4)
para la mujer(id: 3) | botas(id: 4)
en ese caso, si buscás todos los descendientes de "indumentaria" (parent = 1) te va a devolver:
calzados(id: 2)
para la mujer(id: 3)
botas(id: 4)
y si buscás todos los ancestros de "botas" (child = 4), te va a devolver
indumentaria(id: 1)
calzados(id: 2)
para la mujer(id: 3)
El orden de esta query es O(N), siendo N seguramente un valor muy chico. Y si le ponés índices, vuela! O(log(N))
El lado negativo es que te tenés que tomar un poquito más de trabajo al momento de dar de alta las categorías, pero vamos... es super simple y lo hacés solo una vez. Después la query es super simple y te olvidás totalmente de los problemas de queries anidadas!