Ad esempio, supponiamo di voler 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, da un utente a 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 sta restituendo il nome dell'utente, il DOB, il colore preferito e tutte le altre informazioni archiviate nella tabella degli utenti ripetutamente per ogni record (gli utenti inviano messaggi di posta elettronica ai telefoni), presumibilmente consumando larghezza di banda e rallentando giù i risultati.
Non sarebbe più bello se restituisse una singola riga per ciascun utente e all'interno di quel record ci fosse un elenco di e-mail e un elenco di telefoni? Renderebbe molto più facile lavorare anche con i dati.
So che puoi ottenere risultati come questo usando LINQ o forse altri framework, ma sembra essere un punto debole nella progettazione sottostante dei database relazionali.
Potremmo aggirare questo problema usando NoSQL, ma non dovrebbe esserci una via di mezzo?
Mi sto perdendo qualcosa? Perché questo non esiste?
* Sì, è progettato in questo modo. Capisco. Mi chiedo perché non ci sia un'alternativa più facile da lavorare. SQL potrebbe continuare a fare quello che sta facendo ma poi potrebbe aggiungere una o due parole chiave 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 script a tua scelta, ma richiede che il server SQL invii dati ridondanti (esempio di seguito) o che invii più query come SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Invece di fare in modo che MySQL restituisca qualcosa di simile a questo:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "johnsmith45@gmail.com",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "john@smithsunite.com",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "originaljane@deerclan.com",
}
]
E poi dover raggruppare un identificatore univoco (il che significa che devo recuperarlo anche io) sul lato client per riformattare il set di risultati come lo si desidera, basta restituire questo:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["originaljane@deerclan.com"],
}
]
In alternativa, posso inviare 3 query: 1 per gli utenti, 1 per le e-mail e 1 per i numeri di telefono, ma quindi i set di risultati di e-mail e numeri di telefono devono contenere user_id in modo da poterli ricollegare con gli utenti Ho precedentemente recuperato. Ancora una volta, dati ridondanti e post-elaborazione inutile.