Mehrdimensionale Arrays in Datenbank. Welche?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
643
Hallo,

nehmen wir an zB 50 Programme schreiben Lokal in eine Datenbank diverse mehrdimensionalen Arrays rein und dies in unregelmäßigem Abstand oder auch mal gleichzeitig. Gleichzeitig ließt ein anderes lokales Programm regelmäßig bestimmte Arrays aus der Datenbank raus.
Welche Datenbank wäre für ein solchen Zweck geeignet? Bisher bin ich über MySQL und SQLite gestolpert. Hat jemand eine bestimmte Empfehlung?

Danke schonmal
Gruß
 
Schreiben/updaten die Teilnehmer die gleiche Zeile, oder wird einfach nur ein neuer Eintrag in einer Tabelle erstellt?

Isolationsebenen/Transaktionen wären vielleicht ein paar Stichwörter. gerade beim parallelen Lesen der eingetragenen Daten vielleicht praktisch.
 
Zuletzt bearbeitet:
Wie sieht denn so ein Mehrdimensionaler Array aus?
Ein Beispiel?
Weil eigentlich sollte man das relativ leicht in eine Tabelle überführen können.
 
Hellblazer schrieb:
Schreiben/updaten die Teilnehmer die gleiche Zeile, oder wird einfach nur ein neuer Eintrag in einer Tabelle erstellt?
Nein die Programme schreiben sozusagen nur ihre eigenen Daten. Also die Daten die Programm A schreibt werden von Programm B,C,D,E... nicht angerührt. Nur ein anderes Programm x soll auf alle Daten Zugriff haben da geht es aber eher um lesen. Also kurz gesagt der gleichzeitige Schreibzugriff auf die selbe Tabelle/Array wird nicht vorkommen aber das gleichzeitige Schreiben in die Datenbank kann definitiv vorkommen.


xSeppelx schrieb:
Wie sieht denn so ein Mehrdimensionaler Array aus?
Ein Beispiel?
Weil eigentlich sollte man das relativ leicht in eine Tabelle überführen können.

im schlimmsten Fall ein dreidimensionales zB: array[10000][50][4], die meißten sind aber 2Dimensional. Datentyp ist überwiegend double

Gruß
 
Vom Schreiben her dürfte es da also nicht zu Kollisionen kommen.
Wenn die Daten nicht geupdatet (also Zeilen verändert werden), dürfte es beim Lesen auch keine Probleme geben.
Es wäre nicht verkehrt mit Transaktionen zu arbeiten anstatt alles einfach mit einem einfachen INSERT in die Tabelle zu schreiben. Kommt aber auf deinen Anwendungsfall an.

Im Desktop/Server-Bereich bietet sich MySQL eher an als SQLite (zu eingeschränkt). Es gibt aber auch noch PostgreSQL als Alternative zu MySQL (oder MariaDB, Fork von MySQL). Das wären so die gängisten im kostenlosen Bereich.


Deine Arrays solltest du struktuiert speichern. Ein String in Form von "array[10000][50][4]" und dann noch irgendwie die Daten reinkodieren verstößt gegen das ACID-Prinzip.
Den Array-Einträgen also Namen geben (was stellen die Werte im jeweiligen Index dar?), die dann als Spalte in der Tabelle vorhanden sind, in die dann die Werte eingetragen werden (oder so in der Art, das war jetzt nur ein Beispiel, bei Mehrdimensional vielleicht mit mehreren Tabellen arbeiten, je nachdem), falls du das nicht sowieso schon so machst.
 
Zuletzt bearbeitet:
Ich bin am überlegen, ob es überhaupt Sinn macht an der Stelle eine relationale Datenbank zu nehmen. Ich wäre eher dafür zu einer sogenannten NoSQL-Datenbank zu greifen.
 
Danke schonmal!

@Hellblazer
bin nicht so der Profi das mit ACID..., also heißt das jetzt eine Strukturierung per String wäre eher ungut? Habe bei Recherchen auch gelesen das man JSON oder binär auch speichern kann... Wie gesagt kenne mich damit noch nicht so aus daher die Frage was da so passen würde.


@andy
Ich kenne ehrlich gesagt die Unterschiede noch nicht mit relationalen Datenbanken usw. NoSQL muss ich mir mal angucken. Bisher habe ich nur kleinere Sachen in C geschrieben daher bin ich was Datenbanken usw angeht noch so Newbiemäßig unterwegs.


Was ich vielleicht noch erwähnen sollte, die meißten Arrays in den Programmen rücken sozusagen immer nach also werden aktualisiert und jeder Wert rutscht um eins nach hinten.
array[0][50][4] = 123.456 dann würde eine Speicherung danach das array[1][50][4] den Wert 123.456 erhalten.
oder
array[9999][50][4] = 123.456 dann würde eine Speicherung danach das array[10000][50][4] den Wert 123.456 erhalten
Also das spielt sich im Array in den Programmen ab, wie auch immer das sich auf die übertragung auf die Datenbank auswirkt... statt einzelner Variablen ändern sich permanent alle weil sie immer um eins nachrücken. Keine Ahnung ob das eine Rolle spielt im Bezug auf die wahl einer Datenbank ich wollte es nur mal erwähnt haben.

Gruß
Ergänzung ()

Moin, also SQLite scheint sehr klein und einfach zu sein und man braucht kein Server. Im Prinzip könnte man den Nachteil der Sperrung bei parallelen Schreibzugriffen dadurch kompensieren, die Schreibbefehle in den Programmen in ein Thread zu legen. So pausiert eine mögliche Warteschlange den Programmablauf nicht.
Habe gelesen , dass es Möglich wäre den Inhalt von Arrays einfach binär in die Datenbank zu schmeißen. Das würde die Sache vermutlich vereinfachen.
 
Hancock schrieb:
Eine Frage wäre, wie man Kollisionen im Dateinamen verhindert, aber das ließe sich über ein Lock einer "Masterdatei" lösen.
Jedes Programm hat eine individuelle Nummer zur Identifizierung, diese könnte man dann zur Trennung in der Datenbank verwenden
 
Dann nehm Dateien. Das ist
- einfach
- schnell
- portabel
- ohne externe Bibliotheken
machbar.
Die Dimensionen kannst du beispielsweise mit einem Header abspeichern und dann die Daten so wie sie im RAM liegen.
Ein Problem könnte die Race-Condition mit dem Lesen und Schreiben sein, aber du könntest einfach die Datei locken, dann sollte das hinhauen.
 
Na dann lieber ein Programm was am Anfang die ganzen Daten in den Ram schaufelt und den andern 50 zur Verfügung stellt. Die arbeiten damit, geben die geänderten Daten ans Hauptprogramm und das speichert dann alles schön nacheinander weg. Ob das die Daten dann über Dateien speichert oder in einer Db ist dann Sache des Hauptprogramms.

Eigentlich ist des Pudels Kern doch von welchen Datenmengen wir hier reden. Wenn ich da lese 10000, 50, 4 sind das schon 200.000 Elemente, als json serialisiert mit nem Float mit 8 Stellen sind das 1,6 Millionen Byte + Anführungszeichen und das ganze Jsongedöhns, grob übern Daumen knapp 2Millionen Byte oder 2 Mb. Bei 50 Programmen ist man da schon bei 100Mb, und wenn ich den Te richtig verstehe werden die Arrays bei jeder Änderung komplett durchgeackert.

Über ein Hauptprogramm was die Daten händelt könnte man halt nur alle X Änderungen wegschreiben und sonst die Daten im Ram halten. Wenn ich natürlich von 100Mb ausgehe, die da hin und herfliegen, wird die Datenbankverbindung zum Flaschenhals. Einzelne Dateien dann schon eher, da brauchts dann aber wirklich ein Masterprogramm, glaub bei 50 offenen Filehandels wirds schon eng, oder?

Wär natürlich auch die Frage ob die Datenstruktur da jetzt optimal ist, für mich hört sich das eher nach einem Fall für einfach verkettete Listen an, so fügt man nur ein Element am Anfang ein und die andern rücken nach, aber das ist ein anderer Kriegsschauplatz.

Edit: oder mal so gefragt: was genau treibst du da? Vielleicht geht das alles ganz easy mit wenig Aufwand, wir können hier halt nur mit den Infos arbeiten, die du uns auch gibst.
 
Zuletzt bearbeitet von einem Moderator:
Eigentlich sollte eine Frage ganz vorne stehen: Musst du auf den Array Daten suchen, d.h. müssen darauf Datenbank Querys ausgeführt werden oder erfolgt der Zugriff ausschließlich via ID?

1. Wenn die Struktur der Daten egal ist und du SQL kannst, nimm ein BLOB und fertig. Ist im Grunde genau so wie Dateien auf dem Dateisystem, allerdings musst du dich dafür um nichts mehr kümmern und die Prozesse können auch auf mehreren Rechnern problemlos arbeiten, ohne dass man irgendwas programmieren muss.
2. Wenn drauf gesucht werden soll, würde ich zu MongoDB greifen, damit lassen sich n-dimensionale Arrays extrem einfach abbilden (solang die 16MB Grenze nicht überschritten wird), weil im Grunde einfach JSON Dokumente genutzt werden (bevor jemand meckert, eigentlich ist es BSON. Aber davon bekommt man als Anwender nicht wirklich was mit).
3. Wenn du eine relationale Datenbank willst/brauchst und die Datenstruktur durchsuchbar halten willst: Viel Spaß.. Dafür sind relationale Datenbanken einfach nicht gemacht. Natürlich geht es dank Transaktionen problemlos, aber schön, schnell und effizient ist was anderes. ;)
 
Zuletzt bearbeitet:
Eine entscheidende Frage währe, ob die Größe des Arrays konstant bleibt.
Falls ja hätte ich zwei Ratschläge: Zum einen würde ich das Array vermutlich linearisieren (also in ein eindimensionales Array / eine einzelne Tabelle überführen) und den korrekten Index im Programm berechnen lassen.
Zweitens, wäre es wahrscheinlich besser das ganze als eine Art Ringpuffer zu implementieren. Also anstatt alle Elemente eins nach hinten zu verschieben könnte man die Startposition einfach eins nach vorne verschieben.
 
Zurück
Oben