Erfahren Sie, wie ArangoDB im Vergleich zu anderen Datenbankmanagementsystemen abschneidet und wie Sie ArangoDB verwenden, um ein mehrstufiges verschachteltes Dokumentensystem zu erstellen und zu betreiben.
A QUICK SUMMARY – FOR THE BUSY ONES
Hintergrund und Technologien:
Herausforderung:
Anforderungen an die Lösung:
Mögliche Lösungen wurden bewertet:
DBMS-Bewertung:
Gründe für die Wahl von ArangoDB:
Umsetzung und Vorteile:
Nachteile und Abhilfemaßnahmen:
Lesen Sie weiter, um die Details zu erfahren.
TABLE OF CONTENTS
Als Softwareentwicklungsunternehmen arbeiten wir sehr oft an komplexe Anwendungen die mit vielen Daten umgehen müssen. Vor Kurzem standen wir bei einem unserer Projekte vor einer Herausforderung: Wir hatten viele Daten auf vielen Ebenen und wir mussten in der Lage sein, direkt mit diesen Dokumenten zu arbeiten.
Möchten Sie wissen, wie wir unser Problem gelöst haben?
Begleiten Sie uns auf unserer Reise, um es herauszufinden.
Aber lassen Sie mich zunächst unseren Hintergrund vorstellen.
Bei Brainhub sind wir auf die Entwicklung von Apps mit JavaScript spezialisiert und verwenden dabei die folgenden Technologien:
Wir haben viele Daten über viele Stufen, was in einem Dokumentmodell viele Ebenen verschachtelter Dokumente bedeutet. Darüber hinaus müssen wir in der Lage sein direkt operieren auf diesen verschachtelten Dokumenten (Kinder, Enkelkinder, Urenkel usw.).
Wir müssen eine API erstellen nicht nur für unser Frontend, sondern auch für externe Integrationen. Der Benutzer sollte in der Lage sein, eine zu senden JSON-Schema, das später zur Validierung der bereitgestellten Daten beim Erstellen oder Aktualisieren verwendet wird, und es wird auch verwendet, um Dokumente aus verschiedenen Sammlungen zu verbinden.
Ein Beispiel für ein einfaches JSON-Schema:
{
„$schema“: "http://json-schema.org/draft-04/schema #“,
„title“: „Profile“,
„description“: „Profilschema“,
„type“: „Objekt“,
„Eigenschaften“: {
„ID“: {
„Typ“: „Zeichenfolge“,
„Beschreibung“: „ID“
},
„Adresse“: {
„Typ“: „Zeichenfolge“,
„description“: „Adresse“
},
„E-Mail“: {
„Typ“: „Zeichenfolge“,
„description“: „E-Mail-Adresse“
},
„Vorname“: {
„Typ“: „Zeichenfolge“,
„description“: „Vorname“
},
„Nachname“: {
„Typ“: „Zeichenfolge“,
„description“: „Nachname“
},
„Transaktionen“: {
„Typ“: „Array“,
„description“: „Liste der mit dem Profil verbundenen Transaktionen“,
„Artikel“: {
„title“: „Transaktionen“,
„type“: „Objekt“,
„Eigenschaften“: {
„ID“: {
„Typ“: „Zeichenfolge“,
„Beschreibung“: „ID“
},
„Gesamtbestellmenge“: {
„Typ“: „Zeichenfolge“,
„description“: „Gesamtwert der Transaktion“
},
„Rechnungen“: {
„Typ“: „Array“,
„description“: „Liste der Rechnungen im Zusammenhang mit der Transaktion“,
„Artikel“: {
„title“: „Rechnungen“,
„type“: „Objekt“,
„Eigenschaften“: {
„ID“: {
„Typ“: „Zeichenfolge“,
„Beschreibung“: „ID“
},
„Rabattprozent“: {
„Typ“: „Zeichenfolge“,
„description“: „Rabatt in Prozent“
},
„Artikelnr.“: {
„Typ“: „Zeichenfolge“,
„description“: „Artikel-ID“
}
}
}
}
}
}
}
}
}
Es gibt also die folgenden Lösungen:
Wir hätten gerne ein DBMS, das erfüllt:
Andere nützliche Eigenschaften sind:
Wir lieben Open-Source-Lösungen, deshalb haben wir DBMS wie Oracle, SQL Server, DB2 und bei Lizenzproblemen MySQL eliminiert.
Wir haben eine gemacht Vergleich vieler No-SQL-DBMS (nicht nur für dieses Projekt, sondern auch um einen Überblick über andere Projekte zu haben, sind die Daten vom 18. Februar 2018):
Wir haben einige DBMS von der Spitze oben übernommen, aber eliminiert:
Darüber hinaus haben wir beschlossen, unter den SQL-DBMS nur PostgreSQL in unsere Forschung einzubeziehen, da es die Speicherung von JSON-ähnlichen Daten ermöglicht, die wir benötigen.
Basierend auf der obigen Tabelle und anderen Untersuchungen scheinen folgende DBMS unseren Bedürfnissen am besten zu entsprechen:
ArangoDB scheint so etwas wie MongoDB zu sein (wir haben die meiste Erfahrung mit MongoDB) mit einigen zusätzlichen Funktionen. Natürlich fehlen einige MongoDB-Funktionen wie das Aggregation Framework, aber in Wirklichkeit fehlt dieses nicht, sondern wurde durch etwas Benutzerfreundlicheres ersetzt — AQL + tritt bei.
ArangoDB bietet wie MongoDB Clustering, obwohl sich das ArangoDB-Clustering in der Produktion nicht als stabil erwiesen hat. Einer der Schlüsselfaktoren war ein sehr aktive Community. Es hat ein sehr niedriges Verhältnis von offenen Fragen zur Gesamtzahl der Probleme. Darüber hinaus kann jeder problemlos auf ArangoDB Slack zugreifen, wo das Support-Team sehr hilfreich ist. Auch in Stackoverflow geben sie angemessene Antworten.
Ein weiterer Grund war, dass ArangoDB ein mehrere Modelle DBMS, was nützlich ist, da wir planten, unsere Dokumente um die Verwendung von Grafiken zu erweitern.
Wir haben gebraucht die folgenden ArangoDB-Funktionen:
Wir sind potenziell beabsichtige Nutzung in der Zukunft:
In der ArangoDB-Shell haben wir eine sehr nützliche Funktion gefunden, die es in MongoDB nicht gibt. Um AQL zu lernen, wurden keine Daten in den Sammlungen benötigt, da es möglich ist, etwas wie das Folgende einzugeben:
db. _query ('für i in [1,2,3] gib i * i')
Da eine der Anforderungen darin bestand, die Daten aus vielen Sammlungen mithilfe des bereitgestellten JSON-Schemas zu erstellen, suchten wir nach einem ArangoDB-Abfrage-Builder.
Wir haben etwas gefunden, das ziemlich unbeliebt war und dem viele Funktionen fehlten, also haben wir unseren eigenen ArangoDB-Abfrage-Builder erstellt.
Wir haben eine abstrakte Schnittstelle erstellt, sodass beim Ersetzen von ArangoDB durch ein anderes DBMS nur die innere Implementierung geändert wurde.
Ein Beispielcode unseres Query Builders:
const QueryBuilder = () => {
const priv = {
//private Felder und Methoden
};
const pub = {
getQueryTree () {
gib priv.queryTree zurück;
},
fromSchema (Schema) {
priv.mainCollectionName = schema.title;
priv.queryTree.loop = `FÜR $ {schema.title} Artikel in $ {schema.title} `;
priv.queryTree.Sorting = `SORTIEREN $ {schema.title} item.id`;
//etwas mehr Code
Kneipe zurückgeben;
},
withLimit (Offset, Anzahl) {
//etwas Code
},
von Id (id) {
//etwas Code
},
byIdentifiers (Bezeichner) {
//etwas Code
},
byParentId (Sammlungsname, ID) {
//etwas Code
},
zu Aql () {
zurückkehren [
priv.toString (),
priv.bindungen,
];
},
};
Kneipe zurückgeben;
};
exportiere den Standard-QueryBuilder;
Wir haben JavaScript-Code erstellt, der auf dem ArangoDB-Server läuft, und wir verwenden diesen Code für die meisten Transaktionen.
//Diese Funktion wird auf dem ArangoDB-Server ausgeführt und kann daher nicht alle es6-Funktionen nutzen
const DbProcedure = (Parameter) => {
const db = require ('intern') .db;
const updateProperObject = () => {
const-Sammlung = db. _collection (params.myCollectionName);
gibt collection.updateByExample zurück ({id: params.newObject.id}, params.newObject);
};
const removeObjects = (Sammlungsname) => {
params.childrenIdsToBeRemove [Sammlungsname] .forEach ((id) => {
db. _Sammlung (Sammlungsname). removeByExample ({id});
});
};
/*
* Die verbleibenden öffentlichen und privaten Methoden
*/
const aktionen = {
erstellen,
aktualisieren,
entfernen,
überschreiben,
};
Aktionen zurückgeben [params.action] ();
};
exportiert Standard-DbProcedure;
Es war ziemlich cool, dass wir einige beliebte Bibliotheken wie Lodash sogar auf dem Datenbankserver verwenden konnten.
ArangoDB bietet ein HTTP-Framework namens Foxx was die Erstellung von Microservices vereinfacht, die eine Verbindung zu ArangoDB herstellen.
Wir haben uns jedoch entschieden Foxx nicht zu benutzen weil wir nicht wollten, dass unsere Microservices von einer Datenbank abhängig sind (wie es bei der Verwendung von MongoDB + Mongoose oder der direkten Verbindung zwischen Frontend und CouchDB-REST-API der Fall ist). Stattdessen haben wir erstellt abstrakte Modelle die intern ArangoDB verwenden.
Dieser Ansatz erwies sich als gute Wahl, da wir später an einigen kritischen Stellen des Systems ArangoDB durch Redis ersetzen mussten, um Engpässe zu beseitigen, die die Gesamtleistung beeinträchtigten.
Dank AQL schreiben und debuggen Anfragen war viel einfacher als bei der Verwendung des MongoDB Aggregation Framework. Außerdem die Transaktionen waren sehr hilfreich. Sogar beim Laufen Javascript Code auf dem Datenbankserver war einfacher als in MongoDB, weil es möglich war, einige Bibliotheken wie Lodash zu verwenden.
Leider war ArangoDB nicht schnell genug um eine sehr große Anzahl von Schreib-/Lesevorgängen in kurzer Zeit abzuwickeln (aber selbst mit anderen DBMS, z. B. MongoDB oder MySQL, wäre das Schreiben von Daten auf die Festplatte zu langsam). Deshalb haben wir uns bei einigen Microservices dafür entschieden ersetzen ArangoDB in Redis, das im Speicher arbeitet.
Aber selbst in dieser Situation war die Verwendung von ArangoDB eine bessere Wahl als MongoDB + Mongoose weil Mongoose-Modelle normalerweise die gesamte Architektur von DBMS abhängig machen.
Andererseits haben wir mit ArangoDB ein abstraktes Modell erstellt, sodass es relativ einfach war, ein DBMS durch ein anderes zu ersetzen.
Beachten Sie, dass MongoDB auch mit einem solchen abstrakten Modell verwendet werden kann — also sage ich nur, dass ArangoDB + unsere abstrakten Modelle viel besser sein können als MongoDB + Mongoose.
Our promise
Every year, Brainhub helps 750,000+ founders, leaders and software engineers make smart tech decisions. We earn that trust by openly sharing our insights based on practical software engineering experience.
Authors
Read next
Popular this month