Ich bin gerade auf diese Frage gestoßen, und obwohl es eine alte ist, dachte ich, es wäre nützlich, ein paar Möglichkeiten hinzuzufügen, die in den gegebenen Antworten nicht erwähnt werden. Außerdem haben sich die Dinge in den letzten Jahren etwas weiterentwickelt, sodass hervorzuheben ist, dass SQL und NoSQL näher zusammenrücken.
Einer der Kommentatoren brachte die kluge warnende Haltung vor, dass „wenn Daten relational sind, verwenden Sie relational“. Dieser Kommentar ist jedoch nur in der relationalen Welt sinnvoll, in der Schemata immer vor der Anwendung stehen.
RELATIONAL WORLD: Strukturdaten> Anwendung schreiben, um sie zu erhalten
NOSQL WORLD: Designanwendung > Strukturdaten entsprechend
Auch wenn Daten relational sind, ist NoSQL immer noch eine Option. Zum Beispiel sind Eins-zu-Viele-Beziehungen überhaupt kein Problem und werden in MongoDB-Dokumenten ausführlich behandelt
Eine 2015 Lösung für ein 2010 Problem
Seit diese Frage gestellt wurde, gab es ernsthafte Versuche, noSQL näher an SQL heranzuführen. Das Team um Yannis Papakonstantinou von der University of California (San Diego) hat an FORWARD gearbeitet , einer Implementierung von SQL ++, die bald die Lösung für anhaltende Probleme wie das hier veröffentlichte sein könnte.
Auf einer praktischeren Ebene hat die Veröffentlichung von Couchbase 4.0 dazu geführt, dass Sie zum ersten Mal native JOINs in NoSQL ausführen können. Sie verwenden ihre eigene N1QL. Dies ist ein Beispiel JOIN
aus ihren Tutorials :
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 ermöglicht die meisten, wenn nicht alle SQL-Operationen, einschließlich Aggregration, Filterung usw.
DIE NICHT SO NEUE HYBRID-LÖSUNG
Wenn MongoDB immer noch die einzige Option ist, möchte ich auf meinen Punkt zurückkommen, dass die Anwendung Vorrang vor der Datenstruktur haben sollte. Keine der Antworten erwähnt die hybride Einbettung, wobei die meisten abgefragten Daten in das Dokument / Objekt eingebettet werden und Referenzen für eine Minderheit von Fällen aufbewahrt werden.
Beispiel: Können Informationen (außer Rollennamen) warten? Könnte das Bootstrapping der Anwendung schneller sein, wenn nichts angefordert wird, was der Benutzer noch nicht benötigt?
Dies kann der Fall sein, wenn sich der Benutzer anmeldet und alle Optionen für alle Rollen anzeigen muss, zu denen er gehört. Der Benutzer ist jedoch ein "Ingenieur", und Optionen für diese Rolle werden selten verwendet. Dies bedeutet, dass die Anwendung nur die Optionen für einen Ingenieur anzeigen muss, wenn er darauf klicken möchte.
Dies kann mit einem Dokument erreicht werden, das der Anwendung zu Beginn mitteilt (1), zu welchen Rollen der Benutzer gehört und (2) wo Informationen zu einem Ereignis abgerufen werden können, das mit einer bestimmten Rolle verknüpft ist.
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
Oder, noch besser, indizieren Sie das Feld role.name in der Rollensammlung, und Sie müssen möglicherweise auch ObjectID () nicht einbetten.
Ein weiteres Beispiel: Werden ständig Informationen zu ALLEN Rollen angefordert?
Es kann auch vorkommen, dass sich der Benutzer beim Dashboard anmeldet und in 90% der Fälle Aufgaben ausführt, die mit der Rolle "Ingenieur" verknüpft sind. Die hybride Einbettung könnte für diese bestimmte Rolle vollständig durchgeführt werden und Referenzen nur für den Rest behalten.
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
Schemalos zu sein ist nicht nur ein Merkmal von NoSQL, es könnte in diesem Fall von Vorteil sein. Es ist absolut gültig, verschiedene Objekttypen in der Eigenschaft "Rollen" eines Benutzerobjekts zu verschachteln.