Mi sono appena imbattuto in questa domanda e, sebbene sia vecchia, ho pensato che sarebbe stato utile aggiungere un paio di possibilità non menzionate nelle risposte fornite. Inoltre, le cose sono andate un po 'avanti negli ultimi anni, quindi vale la pena sottolineare che SQL e NoSQL si stanno avvicinando.
Uno dei commentatori ha sollevato il saggio atteggiamento cautelativo secondo cui "se i dati sono relazionali, usa la relazione". Tuttavia, quel commento ha senso solo nel mondo relazionale, dove gli schemi vengono sempre prima dell'applicazione.
MONDO RELATIVO: Dati struttura> Scrivi applicazione per ottenerlo
MONDO NOSQL: Progetta applicazione> Dati struttura di conseguenza
Anche se i dati sono relazionali, NoSQL è ancora un'opzione. Ad esempio, le relazioni uno-a-molti non sono affatto un problema e sono ampiamente trattate nei documenti MongoDB
UNA SOLUZIONE 2015 A UN PROBLEMA 2010
Da quando questa domanda è stata pubblicata, ci sono stati seri tentativi di avvicinare noSQL a SQL. Il team guidato da Yannis Papakonstantinou dell'Università della California (San Diego) ha lavorato su FORWARD , un'implementazione di SQL ++ che potrebbe presto essere la soluzione a problemi persistenti come quello pubblicato qui.
A un livello più pratico, il rilascio di Couchbase 4.0 ha significato che, per la prima volta, è possibile eseguire JOIN nativi in NoSQL. Usano il proprio N1QL. Questo è un esempio di a JOIN
dai loro tutorial :
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL consente la maggior parte, se non tutte, le operazioni SQL, inclusi aggregrazione, filtro, ecc.
LA NON NUOVA SOLUZIONE IBRIDA
Se MongoDB è ancora l'unica opzione, vorrei tornare al punto in cui l'applicazione dovrebbe avere la precedenza sulla struttura dei dati. Nessuna delle risposte menziona l'incorporamento ibrido, per cui la maggior parte dei dati interrogati è incorporata nel documento / oggetto e i riferimenti sono conservati per una minoranza di casi.
Esempio: le informazioni (diverse dal nome del ruolo) possono attendere? il bootstrap dell'applicazione potrebbe essere più veloce non richiedendo nulla di cui l'utente non abbia ancora bisogno?
Questo potrebbe accadere se l'utente accede e deve vedere tutte le opzioni per tutti i ruoli a cui appartiene. Tuttavia, l'utente è un "ingegnere" e le opzioni per questo ruolo vengono utilizzate raramente. Ciò significa che l'applicazione deve solo mostrare le opzioni per un ingegnere nel caso in cui voglia fare clic su di esse.
Ciò può essere ottenuto con un documento che indica all'applicazione all'inizio (1) a quali ruoli appartiene l'utente e (2) dove ottenere informazioni su un evento collegato a un ruolo particolare.
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
O, ancora meglio, indicizzare il campo role.name nella raccolta ruoli e potrebbe non essere necessario incorporare ObjectID ().
Un altro esempio: le informazioni su TUTTI i ruoli sono richieste TUTTO il tempo?
È possibile che l'utente acceda alla dashboard e che il 90% delle volte esegua attività collegate al ruolo di "Ingegnere". L'incorporamento ibrido potrebbe essere completo per quel particolare ruolo e mantenere i riferimenti solo per il resto.
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
Essere schematici non è solo una caratteristica di NoSQL, potrebbe essere un vantaggio in questo caso. È perfettamente valido per nidificare diversi tipi di oggetti nella proprietà "Ruoli" di un oggetto utente.