2017-11-08 2 views
1

Ich baue ein kleines C++ - Projekt, das statische Daten verwenden wird (es wird nicht auf der Benutzer-Seite geändert werden, nur aktualisiert, wenn Änderungen erforderlich sind). Die Daten selbst bestehen aus fünf verschiedenen Kategorien von Artikeln mit verschiedenen Feldern. Ein Beispiel für diese Elemente wären:In diesem Fall wäre es besser, Daten in einer Datenbank wie SQLite oder in einer flachen Textdatei zu speichern?

item1 {a=3, b=2, d=4} 
item2 {c=4, d=2, m=3} 
... 

Jedes Element eine beliebige Anzahl von Feldern enthalten kann, (a-z für dieses Beispiel) mit einem zugeordneten Wert. Jede Kategorie enthält eine Liste der Elemente (denke an fünf verschiedene Dateien, die wie oben beschrieben Zeilen enthalten).

Das Ziel des Programms wird es sein, aus jeder dieser Kategorien ein Element zu finden, in dem die verschiedenen Felder die Summe der erforderlichen Eingaben ergeben (dh sum (d) == 10, sum (x) == 20). Die resultierenden fünf Elemente werden mindestens diese Anforderungen erfüllen. Ich ziele darauf ab, das kartesische Produkt der fünf verschiedenen Kategorien zu finden (nachdem ich es eingegrenzt habe, indem ich nur die Elemente gefunden habe, die mindestens ein Feld enthalten) und dann die Ergebnisse durchsuche, um die fünf Elemente zu finden das ist richtig.

Nun zu meiner Frage: Ich bin gespannt, ob es besser wäre, die Daten in einer Textdatei zu speichern (und bei jedem Start zu laden) oder SQLite zu verwenden. Die Verwendung von Textdateien wäre sicherlich besser für mich, zumindest für mich. Aber ich bin mir sicher, dass es nicht so effizient ist, alles zu laden und es bei jedem Programmstart in die richtigen Datenobjekte zu speichern.

Mit SQLite hätte ich sofort alles zur Verfügung und wäre in der Lage, die meisten meiner Aufgaben direkt mit Abfragen auszuführen. Ich bin ein wenig unsicher darüber, wie ich die Tabellen eingrenzen würde, bevor ich das kartesische Produkt finde, und dann die Ergebnisse für die Antworten weiter durchblättere. Ich bin sicher, dass ich das mit Zeit und Forschung herausfinden konnte.

Also, Experten von StackOverflow, was ist Ihr Beitrag dazu? Wenn es nicht die spezifischen Operationen wären, die ich für die Daten durchführen möchte, wähle ich SQLite. Aber damit bin ich etwas unsicher und möchte sicherstellen, dass die Einfachheit auf lange Sicht erhalten bleibt.

+0

Ich würde geneigt sein, eine Textdatei mit einem Standard-Serialisierungsformat, wie XML oder JSON zu verwenden. Verwenden Sie eine Datenbank, wenn Sie gleichzeitige Lese- und Schreibvorgänge benötigen, die Ihnen nicht angezeigt werden. – Bathsheba

+0

Wenn die Datenmenge vernünftig ist (was in Ihren RAM ohne Risiken passen kann), würde ich für Text und JSON gehen (wie Batsheba vorgeschlagen hat), heutzutage haben Sie viele vordefinierte Datenstrukturen und Sammlungen, um Daten zu manipulieren. – Marco

+0

Vielleicht eine NoSQL-Lösung? Ihr Datenmodell hat mich über MongoDB nachdenken lassen ... –

Antwort

1

Dies hängt zum Teil davon ab, wie viele Datensätze Sie speichern möchten - ab einer bestimmten Größe beginnen sich die Vorteile eines RDBMS zu zeigen, wenn Sie eine riesige Flat-Datei haben, die Ihren Arbeitsspeicher einschränkt.

Die Regeln, über die Sie sprechen, sind wirklich einfach für die Abfrage, und Sie haben Vorteile der Zuverlässigkeit, Datenintegritätsprüfung und andere Vorteile, die RDBMS bringen. Wenn ich es wäre, würde ich den ganzen Tag SQLite gehen.

+0

Das trägt definitiv dazu bei, die Entscheidung für mich schwieriger zu machen. Allerdings kann ich mir nicht vorstellen, dass jede Kategorie mehr als 500 Einträge hat. Würde das klein sein? – dbrew5

0

Die Verwendung von SQLite würde die Datenbank skalierbar machen, da es abfragebasiert wäre, würde es schneller Manipulationen durchführen, besonders wenn irgendeine neue Operation implementiert werden muss. Dateisystem-Management basierend auf Trennzeichen wäre viel einfacher zu implementieren, da es kein Verständnis der Abfragesprache erfordert. SQLite ist der Code einer anderen Person, während FMS "IHR" Code wäre, so dass Fehler oder Probleme leicht zu diagnostizieren und zu beheben wären.

PS: Ich arbeite gerade an einem EMV-Zahlungssystem (SDK) und musste Aufzeichnungen von Transaktionen führen, ich benutzte zunächst SQLite3 für diesen Zweck, aber später verschoben meine Implementierung zu FMS, weil es zeitweise Probleme mit der db und es gab Es war schwierig, sie zu debuggen, am häufigsten ist ein Fehlercode 21 in SQLite3, für den am wenigsten Hilfe verfügbar ist, zweitens ist es schwer, Speicherlecks zu finden, die ein Neuling leicht erstellt. Kurz gesagt, wenn Ihre Datenbank nicht sehr groß ist, einfach zu verwalten ist und Sie eine Struktur basierend auf Delimetern entwerfen können, würde ich vorschlagen, dass Sie mit FMS gehen, aber stellen Sie sicher, dass es "gut strukturiert".

Verwandte Themen