El diseño adecuado de la base de datos no se parece en nada al diseño de objeto adecuado.
Si planea utilizar la base de datos para algo que no sea simplemente serializar sus objetos (como informes, consultas, uso de múltiples aplicaciones, inteligencia empresarial, etc.), entonces no recomiendo ningún tipo de mapeo simple de objetos a tablas.
Muchas personas piensan que una fila en una tabla de base de datos es una entidad (pasé muchos años pensando en esos términos), pero una fila no es una entidad. Es una proposición. Una relación de base de datos (es decir, tabla) representa una declaración de hechos sobre el mundo. La presencia de la fila indica que el hecho es verdadero (y, a la inversa, su ausencia indica que el hecho es falso).
Con esta comprensión, puede ver que un solo tipo en un programa orientado a objetos puede almacenarse en una docena de relaciones diferentes. Y una variedad de tipos (unidos por herencia, asociación, agregación o completamente no afiliados) pueden almacenarse parcialmente en una sola relación.
Es mejor preguntarse, qué hechos desea almacenar, qué preguntas va a querer respuestas, qué informes desea generar.
Una vez que se crea el diseño adecuado de la base de datos, es simple crear consultas / vistas que le permitan serializar sus objetos a esas relaciones.
Ejemplo:
En un sistema de reserva de hotel, es posible que deba almacenar el hecho de que Jane Doe tiene una reserva para una habitación en el Seaview Inn del 10 al 12 de abril. ¿Es ese un atributo de la entidad del cliente? ¿Es un atributo de la entidad hotelera? ¿Es una entidad de reserva con propiedades que incluyen clientes y hoteles? Podría ser cualquiera o todas esas cosas en un sistema orientado a objetos. En una base de datos, no es ninguna de esas cosas. Es simplemente un hecho desnudo.
Para ver la diferencia, considere las siguientes dos consultas. (1) ¿Cuántas reservas de hotel tiene Jane Doe para el próximo año? (2) ¿Cuántas habitaciones están reservadas para el 10 de abril en el Seaview Inn?
En un sistema orientado a objetos, la consulta (1) es un atributo de la entidad del cliente, y la consulta (2) es un atributo de la entidad del hotel. Esos son los objetos que expondrían esas propiedades en sus API. (Sin embargo, obviamente, los mecanismos internos por los cuales se obtienen esos valores pueden involucrar referencias a otros objetos).
En un sistema de base de datos relacional, ambas consultas examinarían la relación de reserva para obtener sus números, y conceptualmente no hay necesidad de molestarse con ninguna otra "entidad".
Por lo tanto, al intentar almacenar hechos sobre el mundo, en lugar de intentar almacenar entidades con atributos, se construye una base de datos relacional adecuada. Y una vez que se diseña correctamente, las consultas útiles que no se imaginaron durante la fase de diseño se pueden construir fácilmente, ya que todos los hechos necesarios para cumplir con esas consultas se encuentran en sus lugares adecuados.