Daten in RAM zwischenspeichern oder lieber aus DB holen?

NicoDeluxe

NicoDeluxe

Top Contributor
Hallo zusammen,

frohe Ostern erstmal :)

Folgende Situation:

Wir lesen eine externe Datei ein (1GB groß) darin enthalten sind technische Daten zu Produkten. Sagen wir als Beispiel haben wir einen Schlagbohrer (davon sind 100.000 verschiedene Bohrhämmer und was es sonst so gibt)

Jeder Artikel hat Attribute wie Drehzahl, Gewicht, Länge, Breite usw. Aber nicht jedes Produkt hat immer alle Attribute.

Daher speichern wir das wie folgt ab:

- Tabelle attributes_names
id, attributes_name
(1, Drehzahl)
(2, Gewicht)

- Tabelle attributes_values
id, attributes_value
(1, 5000)
(2, 3kg)

- Tabelle attributes_mapping
id, attributes_name_id, attributes_value_id, product_id
(1, 1, 98)
(2, 2, 98)

Der Artikel mit der ID 98 hat also 5000upm und 3kg Gewicht

Soweit so sinnvoll oder?


Nun aber die große Frage. Da man für jedes Produkt schauen muss:
1. gibts den Attributsnamen bereits? Wenn ja ok, bekommt das Product die ID, sonst anlegen
2. gibts den Attributswert bereits zu dem Attributsnamne? Wenn ja ok, bekommt das Product die ID, sonst anlegen

Erste Überlegung war das einfach immer in der DB abzufragen pro Artikel. Macht bei 500.000 Artikeln natürlich sehr sehr viel SQL Abfragerei. Eine andere Idee wäre, die Attributsnamen und Values in einer Map abzuspeichern zu Beginn (alle bestehenden holen, in die Map stecken. Wenn neue kommen die noch nicht in der Map sind, anlegen in der DB und in die Map legen)

Letzteres geht vermutlich wesentlich schneller, aber braucht viel viel RAM, denn es gibt insgesamt über 10000 Attribute (Drehzahlen in 1000, 2000, 3000 4000, Länge in 300,400,500,600 usw.)

Was macht mehr Sinn, lieber alles "frisch" aus der DB holen oder im RAM zwischenspeichern? Ich bin Freund von erstem Vorschlag, eben wegen dem hohen RAMVerbrauch.

Hinweise:
Die DB liegt auf dem selben Gerät wie das Programm, also keine große Latenz
Geräte sind VM oder lokale Computer (wobei der RAM 2-8 GB sein kann, ist ungewiss)
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Jeder Artikel hat Attribute wie Drehzahl, Gewicht, Länge, Breite usw. Aber nicht jedes Produkt hat immer alle Attribute.

Daher speichern wir das wie folgt ab:
Zunächst würde ich das nicht so machen. Wir haben nach diesem Schema, vor ca. 20 Jahren, auch schon einmal eine DB angelegt und fanden das gut (Da war ich gerade ganz neu in dem Job und Autodidakt und hatte wenig Einfluss). Das war aber ein großer Fehler, der sich heute nur mit gigantischem Aufwand korrigieren ließe. Diese Art der Ablage macht auch eine Premium-DB sehr langsam und die Abfragen sehr komplex. Vor allem wenn dann noch Datum und/oder Zeit ins Spiel kommt. Dort gibt es jetzt ca. 4 Milliarden Einheiten mit ca. 11500 Attributen, von denen sich viele doppeln oder eine Art Tabelle darstellen.

Man kann einige Attribute die (fast) immer vorhanden sind zu einer DB-Tabelle zusammenfassen und weitere Attribute die seltener vorhanden sind ebenfalls zu einer (oder auch mehreren) Tabelle mit einer 1:1-Beziehung (manchmal auch 1:n) bündeln. Weiterhin könnte man einige einzigartige Attribute in einer Spalte vom Typ JSON oder XML vorhalten.

Der Text macht schon deutlich, dass ich zur DB tendieren würde. Systeme wachsen und Daten vermehren sich mit der Zeit oft exponentiell. Eine DB lässt sich leicht skalieren und mit JPA stehen wirklich mächtige und komfortable Werkzeuge zur Verfügung. Zur Steigerung des Durchsatzes und Entlastung von Netzwerk und DB kann man auch einen Cache einsetzen.
 
Thallius

Thallius

Top Contributor
Also man muss halt erstmal überlegen welche Datenmengen das maximal werden. Wenn ich heute 100.000 Hammer habe, werde ich wahrscheinlich niemals mehr als 300.000 haben Was im Endeffekt für eine DB keine Herausforderung darstellt. Von daher ist das Konzept von Meier Seite her ok.
Andererseits sparst du dir extrem viel Arbeit wenn du die Attribute einfach in einer JSON column speicherst. Da das ja feste Werte sind die sich niemals ändern werden und auch keine beziehung zu anderen Attributen oder Tabellen haben, würde ich das hier wahrscheinlich sogar bevorzugen.

die Idee Deinen Attributen Namen und wert in einer column zu geben, also ein Attribut für jede Drehzahl, halte ich aber für vollkommen falsch. Was passiert denn wenn ein User später alle Geräte gelistet haben möchte die 3000upm haben? Dann Must du anfangen mit sowas we like ‚%Drehzahl%‘. Da geht jede DB in die Knie.
Deine attribute sollten wenn dann key und value haben und der key und value bekommen einen primary key. Dann wäre der key meinetwegen Drehzahl und die value 3000.
Damit erledigt sich auch dein insert Problem, Du machst dann nämlich einfach einen insert ignore mit jedem Attribut und fertig
 
Zuletzt bearbeitet:
Thallius

Thallius

Top Contributor
Ich bin davon ausgegangen, dass man schon noch bestimmten Herstellern, Produktgruppen, Preisen, Gewichten etc. filtern möchte.
Filtern ist auch nicht das Problem. Hatten wir letztens erst hier als diskussion. Die Suche nach einem JSON Attribut ist sehr schnell. Schwierig wird es eben dann wenn man z.b. hergeht und veränderliche Attribute in einem JSON speichert. Dann muss man bei Änderung des Attributs nämlich alle dB Einträge durchgehen und ändern.
 
NicoDeluxe

NicoDeluxe

Top Contributor
Es sind ja nicht nur Bohrer. Es gibt dann eben auch Kreissägen usw. die haben dann noch viele andere Eigenschaften die ein Bohrer nicht hat. Wie Max Winkel und was weiß ich.
Wenn ich nun aber key value abspeicher, hab ich für jeden Bohrer der 3000 Umdrehungen hat einen Eintrag, richtig?
Also :
1, upm, 3000, productid 999
2, upm, 3000, 1000

dann hab ich zig tausend Einträge für Artikel die upm 3000 haben. Kann dann ja auch für 10.000 verschiedene Kreissägen(so viel Modelle wird’s wohl nicht geben aber bei Schrauben sieht’s schon anders aus. Durchmesser, Länge usw)

json in der Db Speichern ist mir neu, schau ich mir mal an.

nach meiner Idee oben gäbe es aber nur ein Attribut mit Drehzahl in der Tabelle attributes_names

in attributes_values gibts einen Eintrag mit dem Wert also 3000

in der Mappingtabelle wird dann die jeweilige ID mit der ProduktID verknüpft
 
Thallius

Thallius

Top Contributor
du hast drei Tabellen:

1) product mit seiner Id (ist primary key autoincrement) z.b. 1
2) attribut mit Id (unique Auto increment und index, kein primary key), key varchar primary key und value varchar primary key z.b. drehzahl und 3000
3) mapping mit product Id und Attribut Id.

und ja die Mapping Tabelle wird groß aber sie hat ja auch nur 2 integers.

aber wie gesagt. Ich würde mir überlegen die Attribute als JSON zu speichern wobei der Name das Tag ist und der value das value also

Java:
{
    "drehzahl":2000,
    "wasweisich":"egal"
},
 
Zuletzt bearbeitet:
NicoDeluxe

NicoDeluxe

Top Contributor
Ah ok also wäre deine zweite Tabelle dann wie folgt

1, Drehzahl, 3000
2, Drehzahl, 4000
3, Drehzahl, 5000
4, Gewicht, 10kg
4, Gewicht, 20kg

dass die Keys doppelt und dreifach vorkommen sieht mir da bisschen merkwürdig aus (redundante Daten soll man doch meiden und auf Tabellen aufteilen oder)

wenn man dann einen Filter will, wie sollte man das bewerkstelligen? Wenn es Drehzahl als Attribut Name in einer eigenen Tabelle gibt, ist das viel einfacher oder? Brauch dann halt mehr abfragen.

aber BTW. Das war gar nicht meine Hauptfrage 🤣 sondern eher „in den RAM laden oder immer die dB abfragen ob ein Attribut existiert(erstmal unabhängig davon wie man es speichert)
 
Thallius

Thallius

Top Contributor
Ah ok also wäre deine zweite Tabelle dann wie folgt

1, Drehzahl, 3000
2, Drehzahl, 4000
3, Drehzahl, 5000
4, Gewicht, 10kg
4, Gewicht, 20kg

dass die Keys doppelt und dreifach vorkommen sieht mir da bisschen merkwürdig aus (redundante Daten soll man doch meiden und auf Tabellen aufteilen oder)
Ok sorry hast recht. Ist auch dämlich....
 
Thallius

Thallius

Top Contributor
ok, so langsam wirkt der kaffee..

also das du für jede Drehzahl dann einen Eintrag in den Attributen hast ist nicht redundant. Wenn du eine Tabelle mit Drehzahlen hättest, hättest du ja auch einen Eintrag pro Drehzahl. Von daher ist das Konzept so in Ordnung.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Im Grunde ist das ein ganz klassisches Entity-Attribute-Value-Model. Entweder mit Tabellen (was nicht wirklich gut skaliert) oder mit JSON-Colums (was je nach DB-Support besser ist). Dein jetziges Schema scheint dem schon fast zu entsprechen, nur das deine attributes_values und attributes_mapping in einer Tabelle dargestellt sind – das splitten in zwei Tabellen bringt meist nicht wirklich viel.

Sowas wie

Code:
Produkt
123, Säge XY

Attribute
456, Drehzahl, 5000

Mapping
123, 456

klingt auf den ersten Blick auch eher suboptimal.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Zu deinem eigentlichen Problem: das in der DB lösen ist das sinnvollere, aber in der Tabellen-Variante (im Gegensatz zu JSON) auch deutlich komplexer. Potentiell müsstest du da mit INTERSECT u.ä. arbeiten, da ja die Sets an Attributen exakt gleich sein müssen. Das ist auch mit JSON am einfachsten.
 
mihe7

mihe7

Top Contributor
Wir lösen so etwas in der Regel (noch) so, dass wir die Importdatei(en) erstmal in separate Tabellen, die über entsprechende Indizes verfügen, der DB importieren und auch dann nur noch auf der DB arbeiten, um den eigentlichen Importvorgang durchzuführen. Das läuft meist sehr oder wenigstens ausreichend schnell.

Wenn die Daten passen, kann man abhängig von der DB auch darauf zurückgreifen, dass Duplikate beim Einfügen ignoriert werden oder zu einer Aktualisierung der Daten führen.
 
NicoDeluxe

NicoDeluxe

Top Contributor
@mrBrown wie würdest du das lösen? Du sagst meine ursprüngliche Lösung ist ok, die Variante mit product + attribute + mapping (ohne attribute_name, attribute_value) ist suboptimal. Wie würde so ein jason aussehen? Frag mich wie man dann einen schnellen Filter aufbauen könnte
 
NicoDeluxe

NicoDeluxe

Top Contributor
Die wäre Ok, wenn man die beiden values und mapping verschmelzen würde :)
Wie genau meinst du? So wie deinem anderen Post? Dann hab ich aber die Attributnamen doppelt

Produkt
123, Säge XY
124, Säge XYZ
125, Bohrer XY

Attribute
456, Drehzahl, 5000
457, Drehzahl, 3000
458, Drehzahl, 6000

Mapping
123, 456
124, 457
125, 458

Edit, ah verstehe. So hier ist :
1617515051075.png
 
Zuletzt bearbeitet:
temi

temi

Top Contributor
Wie wäre das?

Produkt
123, Säge XY
124, Säge XYZ
125, Bohrer XY

Attribute
456, Drehzahl, 1/min
457, Winkel, °
458, Gewicht, KG

Mapping
123, 456, 5000
123, 458, 1.5
124, 456, 3000
125, 456, 6000
 
NicoDeluxe

NicoDeluxe

Top Contributor
Jetzt Frage ich mich aber wie ich dann einen Filter bauen könnte.

Zb bei einem Onlineshop, wenn ich nen PC kaufen will, wähl ich RAM als Filteroption aus und dann 32GB als Wert.
Wenn der Wert in einer eigenen Tabelle stünde wäre das klar, aber wie im o.g EAV Model? Da steht ja dann 32GB mehrfach drin (oder die Drehzahl um am Beispiel zu bleiben)

Über ein Selecr DISTINCT ?
 
NicoDeluxe

NicoDeluxe

Top Contributor
Distinct brachte mich jetzt noch auf eine Idee...wenn ich es so einfach wie möglich speichere:

attributes
id, key, value, product_id
1, Drehzahl, 1000, 12
2, Drehzahl, 2000, 13

Angenommen wich will einen Filter bauen:
SELECT DISTINCT key from products_attributes

dann haben ich alle Optionen und ich weiss wonach der User suchen will, dann
SELECT DISTINCT value from products_attributes where key =?

Dann wären die Daten zwar in der DB doppelt , aber wesentlich einfacher. Hmpf
 
temi

temi

Top Contributor
Da steht ja dann 32GB mehrfach drin (oder die Drehzahl um am Beispiel zu bleiben)
Was meinst du damit? Wenn es mehrere PC mit einem RAM von 32GB gibt, dann steht es natürlich, dieser Anzahl entsprechend, oft in der DB. Aber das ist ja der Sinn der Sache.

Würdest du oben nach Drehzahl > 4000 filtern, dann erhältst du die Produkte 123 und 125.
 
temi

temi

Top Contributor
Distinct brachte mich jetzt noch auf eine Idee...wenn ich es so einfach wie möglich speichere:

attributes
id, key, value, product_id
1, Drehzahl, 1000, 12
2, Drehzahl, 2000, 13

Angenommen wich will einen Filter bauen:
SELECT DISTINCT key from products_attributes

dann haben ich alle Optionen und ich weiss wonach der User suchen will, dann
SELECT DISTINCT value from products_attributes where key =?

Dann wären die Daten zwar in der DB doppelt , aber wesentlich einfacher. Hmpf
Das ist ja im Prinzip kein Unterschied, außer das anstatt von "456" "Drehzahl" als Attribut-Key dasteht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
NicoDeluxe Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
NicoDeluxe PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
N Daten aus Jar laden Allgemeine Java-Themen 10
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
T Daten effizient verwalten Allgemeine Java-Themen 4
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
L Sicherstellen das 2x die gleichen Daten unter bestimmten Keys enthalten sind. Allgemeine Java-Themen 6
A XML-Daten komprimieren Allgemeine Java-Themen 6
W Datei auslesen und die Daten weiter verarbeiten Allgemeine Java-Themen 4
D (Viele) Daten performant speichern und lesen Allgemeine Java-Themen 5
V Empfangene Daten sinnvoll Puffern Allgemeine Java-Themen 3
B Daten an Tabel Model übergeben Allgemeine Java-Themen 8
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
S Daten in Array als INT-Wert einlesen - jetzt als csv Datei Allgemeine Java-Themen 5
B Daten effizient ein- und auslagern Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben