Was sind die Vorteile von NoSQL (ex MongoDB) gegenüber MySQL, PostGRE SQL oder MSSQL in Drupal? Werden die Vorteile durch die einfache Verwendung des Speichers erzielt oder muss eine Drupal-Konfiguration geändert werden?
Dies ist eine Frage, auf die Károly Négyesi eine "maßgebliche" Antwort geben würde. Er kennt sicherlich den Vorteil der Verwendung von MongoDB mit Drupal.
kiamlaluno
Lesen Sie meine Gedanken .. sehr interessiert an anderen Optionen, wenn es wesentliche Vorteile gibt, und natürlich kommen die Vor-und Nachteile.
Kevin
Antworten:
13
Mit MongoDB können Sie die meisten oder alle Ihre Entitäten schnell und dokumentenorientiert speichern. Diese Art von Speicher skaliert viel besser als der Standard-SQL-basierte Speicher in Drupal Core (der auf einem Schema "Eine Tabelle pro Feld" basiert).
Im aktuellen Status von Drupal 7 hätten Sie:
Die Basistabelle der in SQL gespeicherten Entität (dh die Benutzertabelle, die Knotentabelle usw.)
Alle in SQL gespeicherten Felder
Die Eigenschaften der Entitäten aus ihren in MongoDB duplizierten Basistabellen
Dies ermöglicht eine schnelle Abfrage der Entitäten in MongoDB und die Möglichkeit, komplexe Indizes hinzuzufügen, die von keiner Opensource SQL-Datenbank unterstützt werden (einschließlich tabellenübergreifender Indizes). Gleichzeitig verlieren Sie nicht die Interoperabilität, da die Basistabelle der Entität weiterhin in SQL gespeichert ist und daher von Modulen verknüpft werden kann, die nur SQL unterstützen (wie z. B. Flag).
Diese Art der schnellen Abfrage ist dank des EntityFieldQuery-Mechanismus möglich, mit dem Abfragen zu Entitäten, ihren Eigenschaften und ihren Feldern auf abstrakte Weise erstellt werden können. Die Standardimplementierung in Core übersetzt diese Abfragen in SQL. Das MongoDB-Modul verfügt jedoch über eine vollständige Implementierung, die diese Abfragen von MongoDB direkt befriedigen kann.
Dank des EntityFieldQuery-Backends für Ansichten können Sie diese Leistung mit den gewohnten Tools auf einfache Weise nutzen. Der einzige Nachteil ist, dass Beziehungen nicht unterstützt werden (in der Praxis werden sie jedoch sowieso selten benötigt - und dies kann umgangen werden, indem zusätzliche Daten in das Entitätsobjekt verschoben und als zusätzliche Eigenschaften der Entität verfügbar gemacht werden).
Kurz gesagt, sobald die Abfrageleistung ein Problem in Ihrem Projekt darstellt, das auftritt, sobald Sie über einen signifikanten Datensatz verfügen (beispielsweise beginnend mit einigen Zehntausenden von Entitäten für einen bestimmten Entitätstyp), ist MongoDB ein Nettogewinn für sehr sehr wenige Nachteile. Sehr empfehlenswert.
Damien Tournoud: Wenn Sie Leistungsprobleme mit nur einigen Zehntausend Einträgen haben, liegt wahrscheinlich ein zugrunde liegendes Problem vor (DBMS-Konfiguration, schlecht geschriebene Abfragen, es kann alles sein). Wenn das zugrunde liegende SQL-Schema gut genug ist, sollten Sie sich vor einer Million Einträge in einer einzelnen Tabelle keine Sorgen machen müssen (aber Felder können schnell wachsen, wenn Sie Revisionen und mehrwertige Felder in Betracht ziehen).
Pierre
Genau mein Punkt: Unser Schema ist normalisiert und hat daher eine sehr schlechte Abfrageleistung. Um die Abfrageleistung zu verbessern, müssen Sie das Schema denormalisieren. Der Hauptvorteil der Verwendung von MongoDB in unserem Fall ist, dass es sich um eine Art "automatische Denormalisierungs-Engine" handelt.
Damien Tournoud
Und natürlich ist MongoDB hier großartig, weil es eine dokumentenorientierte Datenbank ist. Das Speichern komplexer Dokumente wie Entitäten im SQL-Speicher ist einfach nur dumm. Es ist unsere Standardimplementierung, aber es bedeutet nicht, dass Sie es verwenden sollten :)
Damien Tournoud
@Pierre: Damien hat über ein paar zehntausend Entities gesprochen , was etwas völlig anderes sein kann als Tabellenzeilen. Sie könnten beispielsweise 10 oder mehr Felder in dieser Entität haben, dann haben Sie 10 zusätzliche Tabellen, die bei jedem Laden einer solchen Entität mit einer separaten Abfrage abgefragt werden müssen. Und MongoDB kann diese zusätzlichen Tabellen ersetzen, nicht die Entity-Basistabelle.
Berdir
2
Kein Modul sollte erwarten, dass die Felder in MySQL sind. Die einzige Möglichkeit, Felder in Drupal 7 abzufragen, ist EntityFieldQuery. Öffnen Sie einen Fehler im Modul, wenn die Feldtabellen direkt abgefragt werden. Ich kenne derzeit keines dieser Module.
Damien Tournoud
7
MongoDB und ähnliche Programme sind so konzipiert, dass strukturierte (hierarchische) Daten relativ flexibel gespeichert werden können.
Zum Beispiel erhält Drupal 7bei der Verwendung field_sql_storagejedes Feld seine eigenen Tabellen. Wenn Sie 10 Felder an einen Inhaltstyp anhängen, werden 10 Tabellen in Ihrer Datenbank gespeichert. Wenn Sie diesen Knoten laden, field_sql_storagewird eine Abfrage pro Feld und pro Knoten (oder bei Verwendung mehrerer Knoten node_load_multiple) ausgeführt.
Wenn Sie mongodb_field_storage verwenden , können Sie alle Felder eines Knotens in einem einzigen Dokument speichern und mit einer einzigen Abfrage abrufen .
Sie können auch andere Dinge wie Watchdog, Sessions, Cache, Blöcke in MongoDB speichern .
Sie benötigen weiterhin MySQL, MongoDB ersetzt es jedoch nicht (nur für bestimmte Teile).
Ein weiterer Vorteil ist, dass es mit einfacher ist die Skalierung MongoDB ist. Sie können einem Cluster mehrere Server hinzufügen, die die Daten gemeinsam nutzen.
Hallo Berdir! Wissen Sie, wenn ich MongoDB in einem vorhandenen Projekt ablege, um die Leistung zu testen, würde ich das Modul ohne Konsequenzen aktivieren und deaktivieren? Ich möchte Mongo ausprobieren, aber was ist, wenn es nicht funktioniert oder so? Ist es sicher zu versuchen? (Ich weiß, Sie können es nicht garantieren, aber ich frage mich, was in den meisten Fällen passiert)
Beto Aveiga
1
Zunächst einmal können Sie es nicht einfach ablegen. Jedes Feld hat konfiguriert, welches Speicher-Backend verwendet wird. Sie müssen Ihre Felder ändern / neu erstellen, Ihre Ansichten neu erstellen (da sie das Backend von efq_views verwenden müssen) ), möglicherweise Ihre eigenen Abfragen, wenn Sie direkte Abfragen für die Felddatentabellen geschrieben haben. Könnte einfacher sein, dieselbe Struktur in einer neuen Installation für einen ersten Vergleich neu zu erstellen.
Berdir
Danke Berdir! Ich habe MongoDB vor ein paar Tagen ausprobiert, aber es gab keinen merklichen Leistungszuwachs, aber ich war mir auch der Dinge / Änderungen nicht bewusst, die Sie mir gerade mitteilen. Ich dachte, "MongoDB sollte bei größeren Sites einen Unterschied machen". Ich werde es erneut mit MongoDB versuchen.
Beto Aveiga
5
Das Für und Wider.
Drupal als Ganzes kann nicht auf MongoDb umgestellt werden, daher müssen Sie zwei Datenbanken unterstützen und sicherstellen, dass sie gut zusammenarbeiten.
Viele Module können nicht mit Mongodb arbeiten, sodass die Interoperabilität verloren geht.
Ich würde nicht wechseln, es sei denn, Sie hätten ein dringendes Bedürfnis (ein Teil Ihres Systems kommt mit der Anzahl der Anfragen / oder der Datenmenge nicht zurecht). Und selbst wenn Sie anfangen, sich Grenzen zu nähern, werfen Sie einen Blick auf das Problem oder die Optimierung, bevor Sie wechseln.
Ich dachte, ich hätte das schon einmal beantwortet, es gibt ein fast doppeltes SO
Antworten:
Mit MongoDB können Sie die meisten oder alle Ihre Entitäten schnell und dokumentenorientiert speichern. Diese Art von Speicher skaliert viel besser als der Standard-SQL-basierte Speicher in Drupal Core (der auf einem Schema "Eine Tabelle pro Feld" basiert).
Im aktuellen Status von Drupal 7 hätten Sie:
Dies ermöglicht eine schnelle Abfrage der Entitäten in MongoDB und die Möglichkeit, komplexe Indizes hinzuzufügen, die von keiner Opensource SQL-Datenbank unterstützt werden (einschließlich tabellenübergreifender Indizes). Gleichzeitig verlieren Sie nicht die Interoperabilität, da die Basistabelle der Entität weiterhin in SQL gespeichert ist und daher von Modulen verknüpft werden kann, die nur SQL unterstützen (wie z. B. Flag).
Diese Art der schnellen Abfrage ist dank des EntityFieldQuery-Mechanismus möglich, mit dem Abfragen zu Entitäten, ihren Eigenschaften und ihren Feldern auf abstrakte Weise erstellt werden können. Die Standardimplementierung in Core übersetzt diese Abfragen in SQL. Das MongoDB-Modul verfügt jedoch über eine vollständige Implementierung, die diese Abfragen von MongoDB direkt befriedigen kann.
Dank des EntityFieldQuery-Backends für Ansichten können Sie diese Leistung mit den gewohnten Tools auf einfache Weise nutzen. Der einzige Nachteil ist, dass Beziehungen nicht unterstützt werden (in der Praxis werden sie jedoch sowieso selten benötigt - und dies kann umgangen werden, indem zusätzliche Daten in das Entitätsobjekt verschoben und als zusätzliche Eigenschaften der Entität verfügbar gemacht werden).
Kurz gesagt, sobald die Abfrageleistung ein Problem in Ihrem Projekt darstellt, das auftritt, sobald Sie über einen signifikanten Datensatz verfügen (beispielsweise beginnend mit einigen Zehntausenden von Entitäten für einen bestimmten Entitätstyp), ist MongoDB ein Nettogewinn für sehr sehr wenige Nachteile. Sehr empfehlenswert.
quelle
MongoDB und ähnliche Programme sind so konzipiert, dass strukturierte (hierarchische) Daten relativ flexibel gespeichert werden können.
Zum Beispiel erhält
Drupal 7
bei der Verwendungfield_sql_storage
jedes Feld seine eigenen Tabellen. Wenn Sie 10 Felder an einen Inhaltstyp anhängen, werden 10 Tabellen in Ihrer Datenbank gespeichert. Wenn Sie diesen Knoten laden,field_sql_storage
wird eine Abfrage pro Feld und pro Knoten (oder bei Verwendung mehrerer Knotennode_load_multiple
) ausgeführt.Wenn Sie mongodb_field_storage verwenden , können Sie alle Felder eines Knotens in einem einzigen Dokument speichern und mit einer einzigen Abfrage abrufen .
Sie können auch andere Dinge wie Watchdog, Sessions, Cache, Blöcke in MongoDB speichern .
Sie benötigen weiterhin MySQL, MongoDB ersetzt es jedoch nicht (nur für bestimmte Teile).
Ein weiterer Vorteil ist, dass es mit einfacher ist die Skalierung MongoDB ist. Sie können einem Cluster mehrere Server hinzufügen, die die Daten gemeinsam nutzen.
quelle
Das Für und Wider.
Drupal als Ganzes kann nicht auf MongoDb umgestellt werden, daher müssen Sie zwei Datenbanken unterstützen und sicherstellen, dass sie gut zusammenarbeiten.
Viele Module können nicht mit Mongodb arbeiten, sodass die Interoperabilität verloren geht.
Ich würde nicht wechseln, es sei denn, Sie hätten ein dringendes Bedürfnis (ein Teil Ihres Systems kommt mit der Anzahl der Anfragen / oder der Datenmenge nicht zurecht). Und selbst wenn Sie anfangen, sich Grenzen zu nähern, werfen Sie einen Blick auf das Problem oder die Optimierung, bevor Sie wechseln.
Ich dachte, ich hätte das schon einmal beantwortet, es gibt ein fast doppeltes SO
quelle