Uhhh, te metiste en un problema muy filosófico =P. Hay gente que prefiere diseñar antes el "modelo de datos", o sea la base y luego hacer una tabla para cada clase o tipo de objeto que tenga.
Otros sin embargo prefieren tener todo un modelo de objetos andando, que se sepa que funciona bien y luego hacer la base de datos a partir del modelo.
De la manera 1) normalmente tus objetos terminan solo conteniendo datos (value objects) y hay un objeto "programa" o "sistema" que hace todo. Y eso no es programar orientado a objetos lamento decirlo :P.
De la manera 2) que es la que quizas más me gusta, puede que se complique un poco mas encontrar la relacion entre tus objetos y las tablas de la BD, pero tienes un sistema orientado a objetos, probablemente más robusto y que expresa mejor el problema y lo resuelve de una manera más natural/sencilla/flexible/linda =P.
Si debes hacer algo como categorias/subcategorias lo más común es que debas utilizar un composite (busca composite + design patterns o patrones de diseño en google o wikipedia). El composite explica una forma simple de tener objetos simples y compuestos y tratarlos de la misma manera, que es lo que entiendo que quieres hacer tu, hablar con categorias y subcategorias(que a su vez tienen subcategorias :P)...
Bueno puedo pasarme horas hablando de cosas raras, pero me parece que lo mejor es que encuentres tu solución, probarla, que funcione y nada...
Con respecto a como hacer el juego de categorias, subcategorias y productos, es dificil decirlo porque no se bien que tienes que hacer, pero me parece que lo más correcto no es que las subcategorias conozcan a los productos, sino que los productos conozcan a su categoria para poder preguntarle cosas...
La premisa en objetos, la papa digamos está en preguntarse que objetos participan y que hay que decirle a ellos.
Por ejemplo, si tienes categorias y productos, y quieres saber el precio de un producto, lo más razonable seria que le pidas el precio al producto, no a la categoria. Idem con el total a facturar de un cliente. No se lo pediría a la empresa, se lo pediría al cliente que es quien debería conocer todos sus gastos...
Creo que me fui por las ramas
.