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)
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)