2017-10-17 2 views
1

Ich erstelle ein einfaches Buchhaltungsprogramm für den persönlichen Gebrauch (MEAN-Stack). Ich griff nach Mongo, weil ich damit vertraut bin, aber während ich die Schemata ausarbeite, habe ich Zweifel. Ich möchte meine Gedanken vorstellen und nach Vorschlägen für eine andere Möglichkeit fragen.Hinweise zum Schemadesign - MongoDB oder möglicherweise Neo4J

Da die gleiche Transaktion auf dem Konto einer beliebigen Anzahl von Konten angezeigt werden soll, war mein aktueller Gedanke, die Transaktionen nicht als Filialdokumente der Konten zu speichern, sondern als eigene Sammlung (um zu vermeiden, sie zu duplizieren). Weglassen die unwichtigen Bits, es in etwa so aussehen würde:

var accountSchema = new mongoose.Schema({ 
    name: String, 
    // etc 
}); 

var entrySchema = new mongoose.Schema({ 
    amount: Number, 
    account: {type: mongoose.Schema.Types.ObjectId, ref: 'Account'} 
}); 

var transactionSchema = new mongoose.Schema({ 
    date: Date, 
    debits: [entrySchema], 
    credits: [entrySchema] 
}); 

Während dies scheint mir eine logische Art und Weise die Daten zu speichern, gibt es einige offensichtliche Abfrage betrifft. Wenn ich zum Beispiel das Hauptbuch für ein Konto anzeigen möchte, müsste ich alle Transaktionen für den Zeitraum iterieren und für jedes einzelne sowohl Kredit- als auch Sollsammlungen durchlaufen, um zu prüfen, ob dieses Konto beteiligt war.

Ich habe keine Erfahrung mit Graph dbs, aber ich dachte, dass etwas wie Neo4J besser geeignet sein könnte, diese Art von Daten abzufragen. Meine Frage ist, stimmst du zu oder ist Mongo immer noch eine gute Wahl, aber ich denke über die falschen Schemas nach?

Antwort

1

Ja, Sie haben Recht. Neo4j ist eine gute Wahl, wenn es um verbundene Daten geht.

Ihre aktuelle Strategie besteht grundsätzlich darin, Verweise auf Bezeichner aus anderen Schemas einzubetten (eine Art Fremdschlüssel). Zur Abfragezeit werden vollständige Scans und Join-ähnliche Operationen benötigt, die mit zunehmender Größe Ihrer Datenbank sehr teuer werden.

Außerdem müssen Sie auf Updates und Löschungen dieser referenzierten Daten achten. Andernfalls haben Sie inkonsistente Daten.

Mit einer Graphdatenbank wie Neo4j wird Ihr Datenmodell eine Grafik, die für Ihr Szenario "natürlicher" und intuitiver ist, denke ich. Ich bin nicht ganz verstanden Ihre Anforderungen und Szenario, aber ich glaube, dass das Diagramm Datenmodell wie etwas sein kann:

Sample graph model

diese Weise können Sie die Leistung von Cypher Language verwenden können Ihr Diagramm abzufragen. Um zum Beispiel alle Gutschriften aus einem bestimmten Konto zu bekommen, da „2017.10.10“ Sie tun können:

MATCH(a:Account)<-[:ENTRY_TO]-(e:Entry)<-[:CREDIT]-(t:Transaction) 
WHERE a.id = 10 AND t.date > "2017-10-10" 
RETURN e 

Sie können die Vorteile des Index freien adjacency ergreifen, um die Grafik zu quer und Abfrage mit einem günstigeren Preis weil keine Join-Operationen benötigt werden.

Da Sie mit Neo4j und Graph-Datenbanken nicht vertraut sind, empfehle ich Ihnen, sich im kostenlosen Online-Training getting started with Neo4j umzusehen. Sie können auch die E-Bücher herunterladen: Graph Databases (Von Ian Robinson, Jim Webber und Emil Eifrém) und Learning Neo4j (Von Rik Van Bruggen) kostenlos.

+1

Ich schätze Ihre ausführliche Antwort; Du hast meinen Verdacht bestätigt. Dies wird ein guter Ausgangspunkt sein, um etwas Neues zu lernen, was immer ein Gewinn ist. – amnesia

Verwandte Themen