Wie modelliere ich Daten aus beliebigen CSVs in einer Datenbank?

7

Ich richte eine Weboberfläche für die Datenverwaltung ein. Benutzer laden CSV- oder ähnlich strukturierte Dateien hoch, und ich möchte diese in der Datenbank speichern, damit sie sie bearbeiten können - filtern, sortieren, grafisch darstellen usw.

Ich weiß nicht, wie ich das in einer Datenbank richtig modellieren soll. Ich habe mehrere Ideen, aber keine scheint der richtige Weg zu sein.

  1. Erstellen Sie eine neue Tabelle für jede hochgeladene CSV. Dies würde bedeuten, dass jede Spalte entsprechend eingegeben werden könnte (Ganzzahlen, Zeichenfolgen, Datumsangaben usw.) und jeder Datensatz trivial einer Zeile in der CSV-Datei entsprechen würde. Dies scheint eine natürliche Konzeptualisierung des Problems zu sein - aber würde die Leistung zu einem Problem werden, wenn ich für jede hochgeladene Datei eine neue Tabelle erstellen müsste?

  2. Erstellen Sie eine Tabelle, in der jeder Datensatz ein Dataset (CSV) darstellt, und andere Tabellen, in denen Datenpunkte die ID ihres Datasets in ihrem Datensatz haben. Dies würde bedeuten, dass alle Daten aus einem bestimmten Datensatz auf verschiedene Tabellen verteilt sind und es viel Redundanz geben würde (da jeder Datenpunkt die ID des Datensatzes speichern würde). Dies würde jedoch bedeuten, dass keine Tabellen pro Datensatz erstellt werden müssten.

  3. Andere Variationen von 2. Die meisten meiner anderen Gedanken waren Variationen von Nummer 2 mit verschiedenen Indirektionsgraden.

Meine Frage lautet im Wesentlichen "Wie modelliere ich das richtig?", Das heißt, mit der Fähigkeit, vernünftig zu skalieren.

Die meisten Daten werden wissenschaftlich sein. Wie gehe ich also mit vielen Datensätzen von Größen um, die von trivial (z. B. 10 Spalten und 100 Zeilen) bis massiv (Hunderte von Spalten und Tausende / Millionen von Zeilen) variieren?

tl; dr: Wie modelliere ich beliebige Daten aus einer beliebigen Anzahl wohlgeformter CSVs in einer Datenbank und würde eine neue Tabelle für jede CSV akzeptabel funktionieren?

msolomon
quelle
1
Diese Frage könnte Sie interessieren . Ich habe eine Datenbank für benutzerdefinierte Daten erstellt, aber all diese Daten kamen in verschiedenen Formaten wie CSV oder Excel, sodass meine Situation Ihrer sehr ähnlich war
Rachel,
Vielen Dank, dies scheint ein sehr ähnliches Problem anzugehen. Erwarten Sie, dass viele solcher Tabellen eine akzeptable Leistung erbringen?
Msolomon
Wie viele CSVs werden Sie bearbeiten? Ein paar Dutzend Tische sind vernünftig (aber es lohnt sich kaum, ein System aufzubauen), während ein paar Hundert schwieriger zu verwalten sind. Ein paar tausend? Ich möchte nicht mit dieser Datenbank hängen bleiben.
Kirk Broadhurst

Antworten:

3

Die Frage ist so offen, dass es schwer ist, viel zu sagen.

Und warum benutzt du überhaupt eine Datenbank? Excel macht alles, was Sie bisher beschrieben haben.

Im Ernst, vermeiden Sie es, ein inneres System in Ihrer Datenbank zu erstellen, in dem alle Arten von Daten gespeichert werden können. Sie haben bereits eine DATENBANK. Erstellen Sie Code, der die benötigten Tabellen erstellt. Was ist daran so schlimm? Ich sage Option 1.

Sie wissen, wenn Sie unendliche Flexibilität wünschen, wie wäre es mit einer Quadratmeile weißen Tafel?

ErikE
quelle
Würde das Erstellen einer beliebigen Anzahl von Tabellen (wie in einer potenziell großen Anzahl von Benutzern, die jeweils eine potenziell große Anzahl von Dateien hochladen, die jeweils eine neue Tabelle erstellen würden) besser skalieren als die anderen Optionen?
Msolomon
Datenbanken sind so konzipiert, dass sie große Informationsmengen in Containern enthalten, die als Tabellen bezeichnet werden. Die Daten, die Sie speichern möchten, sind bereits tabellarisch (tabellenartig). Wenn Sie ein "inneres System" erstellen, in dem Metadaten zu Ihren tabellenähnlichen Objekten gespeichert werden, damit sie alle in einer Tabelle zusammengefasst werden können, ist dies per Definition schlechter, da Sie dasselbe zugrunde liegende System verwenden, aber viele davon neu implementieren seine Merkmale darin. Erstellen Sie jede Tabelle in der Datenbank. Erstellen Sie kein eigenes "Table-Storage" -System über der Datenbank. Ich habe einmal eine EAV-Datenbank erstellt, die ich immer noch pflege ... schmerzhaft.
ErikE
Trennen Sie Ihre Benutzer jeweils in sein eigenes Schema ...
ErikE
1

MySQL hat eine CSV-Engine, die Ihnen helfen kann. Ich habe sie jedoch nie erfolgreich getestet.

Die CSV-Engine kann CSV-Dateien (Comma Separated Values) als Tabelle behandeln, unterstützt jedoch keine Indizes für diese. Mit dieser Engine können Sie Dateien in die Datenbank und aus der Datenbank kopieren, während der Server ausgeführt wird. Wenn Sie eine CSV-Datei aus einer Tabelle exportieren und im Datenverzeichnis des MySQL-Servers speichern, kann der Server sie sofort lesen. Wenn Sie Daten in eine CSV-Tabelle schreiben, kann ein externes Programm sie sofort lesen. CSV-Tabellen sind besonders nützlich als Datenaustauschformat und für bestimmte Arten der Protokollierung.

Ich glaube, Sie müssen die Tabelle mit der CSV-Engine erstellen und ihr dieselbe Struktur und denselben Namen wie die CSV-Datei geben. Wahrscheinlich automatisieren Sie diesen Prozess ziemlich einfach.

Dann kopieren Sie einfach die CSV des Benutzers in das Speicherverzeichnis des Servers (ersetzen Sie im Wesentlichen die vom Server erstellte CSV-Datei durch die Benutzer, die Namen müssen genau übereinstimmen).

Dadurch wird jedoch für jede CSV-Datei eine Tabelle erstellt

Jeff
quelle
Dies scheint das Gegenteil von dem zu sein, wonach ich suche. Ich möchte Daten aus einer CSV in einer indizierten Datenbank speichern, aber dies scheint Daten aus einer Datenbank in einer nicht indizierten CSV zu speichern.
Msolomon
0

Mein erster Gedanke ist, die CSV als BLOBs oder mit FILESTREAM zu speichern. Sind diese clientseitigen Funktionen nicht erforderlich, wenn eine Filterung oder grafische Darstellung erforderlich ist?

Ich kann mir nichts Schlimmeres vorstellen, als eine Tabelle pro CSV-Datei zu erstellen. Eine Datenbank mit Zehntausenden von Tabellen kommt meiner Vorstellung von einem Albtraum nahe.

Wenn Sie die einzelnen Datenpunkte speichern müssen (im Gegensatz zur gesamten CSV als einzelnes Objekt), würde ich sie entweder als wohlgeformtes XML speichern, wobei jedem Datensatz ein Konsistenzschema zugeordnet ist, oder als etwas, das Ihrer Option ähnelt 2.

Ich stimme der Antwort von ErikE zu, dass Sie etwas neu erstellen, das existiert, aber genauer gesagt, warum müssen Sie diese in eine Datenbank stellen und was müssen Sie damit tun? Jede CSV würde idealerweise als einzelne Tabelle gespeichert, aber Tausende von Tabellen bereiten nur Kopfschmerzen.

Kirk Broadhurst
quelle
Ich verstehe nicht, warum es sich nur um clientseitige Funktionen handelt. Ich möchte, dass der Server ausgewählte Daten abrufen und für die grafische Darstellung abschalten kann (z. B. auf einem grafischen Server). Dies würde nicht funktionieren, wenn die CSVs BLOBs wären. Wäre es so schrecklich, Tausende von Tabellen zu haben, wenn jede vernünftig benannt wäre (zum Beispiel Präfixe)?
Msolomon
Was ist los mit Tausenden von Tischen? Der einzige wirkliche Unterschied zur Engine besteht in einem geringen Overhead bei den Metadaten (welche Metadaten müssten Sie ohnehin IN-Tabellen speichern, wenn Sie dies nicht tun würden). Die Tabellen, ihre Namen und ihre Berechtigungen sollten vollständig im Code verwaltet und vollständig automatisiert werden. Ich sehe keinen Grund, dass Kopfschmerzen mit gutem Design nicht vermieden werden können.
ErikE
Tausende von Tabellen, in denen ähnliche Datentypen gespeichert sind, ähneln Tausenden von gespeicherten Prozessen oder Funktionen, die ähnliche Aufgaben ausführen. Oft ist es besser, eine Handvoll „intelligenterer“ Prozesse zu erstellen, die die Arbeit vieler nahezu identischer Prozesse ausführen können. Dies ist in erster Linie ein Wartungsproblem. Ich kann das Argument für Tausende von Tabellen sehen, die vollständig automatisiert sind, aber für mich riecht es schlecht.
Kirk Broadhurst
0

Ich würde sagen, es kommt wirklich darauf an

  • Wie viele Dateitypen (verschiedene Datensätze) werden verarbeitet?
  • Wie viel wissen Sie über die Daten?
  • wie allgemein die Weiterverarbeitung ist

Sagen wir, wenn es 1000 verschiedene Arten gibt und diese auf die gleiche Weise verarbeitet werden. Im Allgemeinen würde ich CSV in einer generischen Struktur (EAV) laden und darüber hinaus bestimmte Tabellen erstellen. In diesem Fall analysieren Sie CSV an einer Stelle und nähern sich dem Geschäft wahrscheinlich weiter an, indem Sie bestimmte Geschäftstabellen mit definierten bekannten Datentypen erstellen.

Wenn die Leistung ein Problem darstellt, funktioniert das EAV-Modell (eine Spalte - eine Datenbankzeile) möglicherweise nicht einfach (z. B. 4 GB CSV), sodass Sie direkt in bestimmte Tabellen laden müssen. Wenn die Entwicklungszeit die teuerste von allen ist und die Dateien winzig sind, erstellen Sie etwas Generisches. Wenn Sie eine spezifischere Tabelle benötigen, erstellen Sie eine zusätzliche Ebene mit "normalen" Tabellen. Eine andere Möglichkeit besteht darin, den Code basierend auf Metadaten zu generieren.

Eugene Lycenok
quelle