Ad esempio, dire che voglio recuperare un utente e tutti i suoi numeri di telefono e indirizzi e-mail. I numeri di telefono e le e-mail sono memorizzati in tabelle separate, Un utente per molti telefoni / e-mail. Posso farlo abbastanza facilmente:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Il problema * con questo è che restituisce il nome dell'utente, il DOB, il colore preferito e tutte le altre informazioni memorizzate nella tabella utente più e più volte per ogni record (utenti email registrazioni telefoniche), presumibilmente consumando la larghezza di banda e rallentando i risultati.
Non sarebbe più bello se restituisse una singola riga per ogni utente, e all'interno di quel record c'era un elenco di email e un elenco di telefoni? Faciliterà anche molto più facilmente i dati.
So che puoi ottenere risultati come questo usando LINQ o forse altri framework, ma sembra essere un punto debole nella progettazione di base dei database relazionali.
Potremmo aggirare questo usando NoSQL, ma non dovrebbe esserci qualche via di mezzo?
Mi manca qualcosa? Perché non esiste?
* Sì, è stato progettato in questo modo. Capisco. Mi chiedo perché non ci sia un'alternativa più facile da lavorare. SQL potrebbe continuare a fare ciò che sta facendo, ma potrebbe aggiungere una parola chiave o due per eseguire un po 'di post-elaborazione che restituisce i dati in un formato nidificato anziché in un prodotto cartesiano.
So che questo può essere fatto in un linguaggio di scripting a tua scelta, ma richiede che il server SQL invii dati ridondanti (esempio sotto) o che tu invii più query come SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Invece di avere MySQL restituire qualcosa di simile a questo:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "[email protected]",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "[email protected]",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "[email protected]",
}
]
E poi dovendo raggruppare su qualche identificatore univoco (il che significa che ho bisogno di recuperarlo anche tu!) sul lato client per riformattare il set di risultati come lo vuoi, basta restituirlo:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["[email protected]", "[email protected]"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["[email protected]"],
}
]
In alternativa, posso inviare 3 query: 1 per gli utenti, 1 per le e-mail e 1 per i numeri di telefono, ma i set di risultati del numero di telefono e di e-mail devono contenere user_id in modo da poterli confrontare. con gli utenti che ho precedentemente recuperato. Ancora una volta, dati ridondanti e post-elaborazione inutile.