Par exemple, disons que je veux récupérer un utilisateur et tous ses numéros de téléphone et adresses e-mail. Les numéros de téléphone et les e-mails sont stockés dans des tableaux séparés, un utilisateur pour plusieurs téléphones / e-mails. Je peux le faire assez facilement:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Le problème * avec cela est qu'il renvoie le nom de l'utilisateur, la date de naissance, la couleur préférée et toutes les autres informations stockées dans la table utilisateur encore et encore pour chaque enregistrement (les utilisateurs envoient des enregistrements par téléphone), ce qui suppose vraisemblablement une bande passante et un ralentissement. les résultats.
Ne serait-il pas plus agréable de renvoyer une seule ligne pour chaque utilisateur, et dans cet enregistrement, il y avait une liste de courriels et une liste de téléphones? Cela rendrait également les données beaucoup plus faciles à utiliser.
Je sais que vous pouvez obtenir des résultats comme celui-ci en utilisant LINQ ou peut-être d'autres cadres, mais cela semble être une faiblesse dans la conception sous-jacente des bases de données relationnelles.
Nous pourrions contourner cela en utilisant NoSQL, mais ne devrait-il pas y avoir un juste milieu?
Suis-je en train de manquer quelque chose? Pourquoi cela n'existe-t-il pas?
* Oui, c'est conçu de cette façon. J'ai compris. Je me demande pourquoi il n'y a pas d'alternative plus facile à utiliser. SQL pourrait continuer à faire ce qu'il fait, mais ensuite ils pourraient ajouter un ou deux mots clés pour faire un peu de post-traitement qui renvoie les données dans un format imbriqué au lieu d'un produit cartésien.
Je sais que cela peut être fait dans un langage de script de votre choix, mais cela nécessite que le serveur SQL envoie des données redondantes (exemple ci-dessous) ou que vous émettiez plusieurs requêtes comme SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Au lieu d'avoir MySQL retourner quelque chose de semblable à ceci:
[
{
"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",
}
]
Et puis avoir à regrouper sur un identifiant unique (ce qui signifie que je dois aussi le récupérer!) Côté client pour reformater le jeu de résultats comme vous le souhaitez, il suffit de retourner ceci:
[
{
"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"],
}
]
Alternativement, je peux émettre 3 requêtes: 1 pour les utilisateurs, 1 pour les e-mails et 1 pour les numéros de téléphone, mais les ensembles de résultats de courrier électronique et de numéro de téléphone doivent contenir le user_id afin que je puisse les faire correspondre avec les utilisateurs J'ai déjà récupéré. Encore une fois, des données redondantes et un post-traitement inutile.