2011-03-05 11 views
5

Ero curioso di sapere come il plugin MongoDB per Grails gestisse le relazioni. Al fine di testare questo ho fatto una semplice applicazione con due classi di dominio:MongoDB, Grails e relazioni

Author s hanno due campi: String firstName e String lastName

Book s avere due campi: String title e Author author

Dopo aver configurato MongoDB e Grails Ho creato alcuni Author se Book e ho dato una sbirciatina usando la shell interattiva di MongoDB. Quello che ho trovato è che le relazioni venivano gestite nello stesso modo in cui sarebbero state gestite in un database relazionale: i riferimenti ai campi ID di altri oggetti.

Così ora per le domande:

  1. Affinché GORM per tirare fuori questo, ne ha bisogno una connessione separata per recuperare ogni documento?
  2. Se sì, non sarebbe meglio in un database relazionale come PostgreSQL o MySQL?
  3. Se la risposta alle due domande precedenti è effettivamente "sì", esiste un modo migliore per gestire le relazioni in un database di documenti come MongoDB? Mi rendo conto che MongoDB non dovrebbe essere relazionale, ma ci sono alcune cose che non vedo come aggirare le relazioni senza duplicare i dati (rendendo così l'aggiornamento degli incubi).

Edit: Ho anche appena notato che graal non è l'ordinamento correttamente sul 'id' di proprietà dei miei autori. Ha a che fare con l'utilizzo di MongoDB? Nella shell posso vedere che la proprietà _id di tutti i documenti creati da Grails è del tipo di dati NumberLong.

risposta

3

mi rendo conto MongoDB, non dovrebbe essere relazionale, ma ci sono alcune cose che non vedo come ottenere intorno a relazioni senza duplicazione di dati

Quindi non preoccupatevi. MongoDB non è anti-relazionale, è orientato ai documenti.

In questo caso, Libri e autori sono due oggetti di livello superiore. Non è ragionevole annidare nessuno di loro, sono entrambi entità centrali a pieno titolo.

Nel caso in cui ogni Libro abbia un solo Autore (N: 1), è del tutto ragionevole che il Libro contenga un "Riferimento all'Autore". Certo, dovrai fare due domande. Ma è terribilmente diverso da fare una query di join? La query di join deve ancora eseguire due analisi dell'indice e due ricerche di dati. Quindi non ti stai davvero costando nulla qui.

Nel caso di ogni libro che supporta più autori (M: N), allora si dispone di several options in base alle proprie esigenze.

Non mi piace pensare a MongoDB come "non relazionale", penso che sia più pulita di pensare a come MongoDB query ottimizzata.

Ho anche notato che Grails non si sta ordinando correttamente sulla proprietà 'id' dei miei autori ...

Vorrei controllare direttamente con l'autore Grails. Sembra che stiano memorizzando "stringhe" al posto di ObjectIds (o MongoIDs) reali. Anche se non è critico, questo potrebbe essere un bug.

1

Per quanto riguarda la proprietà id, la documentazione ora mostra che è possibile inserire una dichiarazione di ObjectId id o String id nella classe di dominio per non utilizzare l'implementazione GORM predefinita di utilizzare un'iterazione lunga. Dichiara semplicemente il campo nella tua classe e il plugin si prenderà cura di tutto il resto.

Problemi correlati