En realidad, solo hay dos maneras en que puedo pensar para resolver este problema, que usted mencionó. Personalmente, iría con el primer enfoque (creando un objeto de mapeo como una entidad OO). Esto le impide mantener información redundante y tener que sincronizar; también significa que si la asociación termina teniendo campos propios (la fecha en que el libro fue asignado a esa categoría, digamos), pueden incorporarse fácilmente. Usamos este enfoque para una variedad de asociaciones en nuestro sistema.
Las entidades OO se vería así:
BookCategory {
Book book
Category category
}
Book {
Collection <BookCategory> categories
}
Category {
Collection <BookCategory> categories
}
Aquí usted tiene que mantener la relación de objeto y las dos colecciones en sincronía; sin embargo, las colecciones son opcionales en este caso. Normalmente, usted podría obtener la misma información con una consulta ORM, algo así como: seleccione b.book de BookCategory b donde b.category = MyCategory
La alternativa es tener una configuración como:
Book {
Collection<Category> categories
}
Category {
Collection<Books> books
}
Si su herramienta ORM/DB mantiene automáticamente las asociaciones, esto está bien; de lo contrario, estás atascado actualizando ambas colecciones. (En Hibernate, un lado tendrá la propiedad: Inverse = true en el mapeo; este lado no se actualiza, por lo que estrictamente no es necesario mantenerlo. Sin embargo, esto me parece una mala práctica)
Si normalmente solo accede a la relación de una manera (por ejemplo, obteniendo todos los libros en una categoría), puede eliminar la colección del otro lado; entonces creo que tendrías que trabajar con la herramienta ORM y usar una consulta nativa para acceder a la relación desde la otra dirección.
Usamos Hibernate (una herramienta de mapeo relacional de objetos basada en Java) en nuestro proyecto; los documentos de Hibernate son una buena referencia para OO/problemas de diseño relacional, aunque es posible que deba dedicar un poco de tiempo a aprender sobre Hibernate para que sean útiles: http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#collections-ofvalues
HTH!
Quería ver si podía evitar crear un dbschema, crear tablas, crear objetos, mapear tablas a objetos, etc. etc. Parece que un odbms podría cortar una gran cantidad del trabajo de burro ... – paul
Podría cortar parte de ese trabajo, pero también lo haría una capa ORM decente. No digo que ODBMS sea la opción incorrecta, pero hay alternativas que pueden serle útiles o mejores. –