Angenommen, ich möchte einen Benutzer und alle seine Telefonnummern und E-Mail-Adressen abrufen. Die Telefonnummern und E-Mails werden in separaten Tabellen gespeichert, Ein Benutzer zu vielen Telefonen / E-Mails. Das kann ich ganz einfach machen:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Das Problem * dabei ist, dass der Name des Benutzers, das DOB, die Lieblingsfarbe und alle anderen Informationen, die in der Benutzertabelle gespeichert sind, für jeden Datensatz immer wieder zurückgegeben werden (Benutzer sendet E- Mail-Telefondatensätze), was vermutlich die Bandbreite verschlingt und verlangsamt die Ergebnisse aufschreiben.
Wäre es nicht schöner, wenn für jeden Benutzer eine einzelne Zeile zurückgegeben würde und in diesem Datensatz eine Liste von E-Mails und eine Liste von Telefonen enthalten wäre? Dies würde die Arbeit mit den Daten erheblich erleichtern.
Ich weiß, dass Sie mit LINQ oder anderen Frameworks solche Ergebnisse erzielen können, aber es scheint eine Schwäche im zugrunde liegenden Design relationaler Datenbanken zu sein.
Wir könnten das mit NoSQL umgehen, aber sollte es keinen Mittelweg geben?
Vermisse ich etwas? Warum gibt es das nicht?
* Ja, es ist so konzipiert. Ich verstehe es. Ich frage mich, warum es keine Alternative gibt, mit der man einfacher arbeiten kann. SQL könnte weitermachen, was es tut, aber dann könnten sie ein oder zwei Schlüsselwörter hinzufügen, um ein bisschen Nachbearbeitung zu machen, die die Daten in einem verschachtelten Format anstelle eines kartesischen Produkts zurückgibt.
Ich weiß, dass dies in einer Skriptsprache Ihrer Wahl durchgeführt werden kann, aber es erfordert, dass der SQL Server entweder redundante Daten sendet (Beispiel unten) oder dass Sie mehrere Abfragen wie ausgeben SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Anstatt MySQL so etwas zurückgeben zu lassen:
[
{
"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",
}
]
Und dann müssen Sie eine eindeutige ID gruppieren (was bedeutet, dass ich diese auch abrufen muss!), Um die Ergebnismenge nach Ihren Wünschen neu zu formatieren. Geben Sie einfach Folgendes zurück:
[
{
"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"],
}
]
Alternativ kann ich drei Abfragen ausführen: eine für die Benutzer, eine für die E-Mails und eine für die Telefonnummern. In den Ergebnismengen für E-Mail und Telefonnummer muss jedoch die user_id enthalten sein, damit ich sie wieder den Benutzern zuordnen kann Ich habe vorher geholt. Wieder redundante Daten und unnötige Nachbearbeitung.