Ci sono davvero solo due modi in cui posso pensare di risolvere questo problema, entrambi i quali hai menzionato. Personalmente, andrei con il primo approccio (creando un oggetto di mappatura come entità OO). Ciò ti impedisce di mantenere le informazioni ridondanti e di sincronizzarle; significa anche che se l'associazione finisce per avere campi propri (la data in cui il libro è stato assegnato a quella categoria, diciamo), possono essere incorporati facilmente. Usiamo questo approccio per una varietà di associazioni nel nostro sistema.
Le entità OO sarebbe simile:
BookCategory {
Book book
Category category
}
Book {
Collection <BookCategory> categories
}
Category {
Collection <BookCategory> categories
}
Qui devi tenere l'oggetto relazione e le due collezioni in sintonia; tuttavia, le raccolte sono facoltative in questo caso. In genere si potrebbe ottenere le stesse informazioni con una query ORM, qualcosa di simile: selezionare b.book da BookCategory b dove b.category = MyCategory
L'alternativa è quella di avere una configurazione simile:
Book {
Collection<Category> categories
}
Category {
Collection<Books> books
}
Se il tuo strumento ORM/DB mantiene automaticamente le associazioni, questo va bene; altrimenti, sei bloccato ad aggiornare entrambe le raccolte. (In Hibernate, una parte avrà la proprietà: inverse = true sulla mappatura, questo lato non viene aggiornato, quindi non è necessario mantenerlo rigorosamente.Per questo mi sembra una cattiva pratica, però.)
Se in genere si accede alla relazione solo in un modo (ad esempio, ottenendo tutti i libri in una categoria), è possibile eliminare la raccolta dall'altra parte; quindi penso che dovresti lavorare attorno allo strumento ORM e usare una query nativa per accedere alla relazione dall'altra direzione.
Usiamo Hibernate (uno strumento di mappatura relazionale di oggetti basato su java) sul nostro progetto; i documenti Hibernate sono un buon riferimento per problemi di progettazione relazionale OO, anche se potresti dover dedicare un po 'di tempo all'apprendimento di Hibernate per renderli utili: http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#collections-ofvalues
HTH!
Volevo vedere se potevo evitare di creare un dbschema, creare tabelle, creare oggetti, mappare tabelle ad oggetti, ecc ecc. Ecc. Sembra che un odbms potrebbe tagliare molto del lavoro dell'asino ... – paul
Potrebbe tagliare un po 'di quel lavoro, ma anche un buon livello di ORM. Non sto dicendo che ODBMS sia la scelta sbagliata, ma ci sono alternative che potrebbero servire anche a te o meglio. –