4k Aufrufe
Gefragt in Datenbanken von adalbert Einsteiger_in (65 Punkte)
Hallo!

Ich bastle gerade an einer "Datenbank" in der primitivsten Form: Es sind nur Textdateien!
Wenn das Ding fertig ist, möchte ich mithilfe eines Skripts (PHP oder Perl) eine Auswertung aller Daten in allen möglichen Eigenschaftskombis machen.
Da das Ding nicht so klein ist, stelle ich mir die Frage, ob es nicht performanter wäre eine Datenbanksoftware zu benutzen.
Ich bin mir aber nicht sicher, denn ich hab sowas noch nie gemacht und keine Vorstellung davon, wie das ablaufen würde.
Deshalb mal eine Frage, nur zum besseren Verständnis:

Angenommen ich habe Datensätze wie folgt:
ID Farbe Grösse Preis
1 rot gross 15
2 blau klein 9
3 rot klein 7
.. .. .. ..

Also zwei Eigenschaften mit jeweils zwei möglichen Ausprägungen:
Farbe: rot|blau
Grösse: gross|klein

Dann möchte ich für jede Eigenschaftenkombi die Anzahl des Vorkommens, den Durchschnittspreis und die Standardabweichung des Preises haben.
Also so:

Farbe Grösse Anzahl Preis Abweichung
egal egal 120 10,1 2,4
egal gross 50 14,3 ..
egal klein 70 .. ..
rot egal .. .. ..
rot gross .. .. ..
rot klein .. .. ..
blau egal .. .. ..
blau gross .. .. ..
blau klein .. .. ..

Meine Frage lautet: Wie läuft das so ungefähr ab? Vor allem: Wieviele Queries benötigt man dafür? Geht das mit Einem? Oder braucht man einen Query pro Ergebniszeile? Oder sogar mehr?

Vielen Dank!

14 Antworten

0 Punkte
Beantwortet von kjg17 Profi (34.4k Punkte)
Hallo Adalbert,

ich würde vorschlagen dass du Base von Open Office verwendest. Kostet nichts und ist auf der Höhe der Zeit.

Für einen 'kleinen' Überblick -> Base ab Version 2.0 - Eine Einführung (PDF, 7 MB, 414 Seiten). Hier wird auch beschrieben, wie Datenbanken grundsätzlich funktionieren und dieses Verständnis benötigt man auf jeden Fall, egal mit welcher Programmiersprache man dann arbeiten will.

Gruß
Kalle
0 Punkte
Beantwortet von adalbert Einsteiger_in (65 Punkte)
Danke für den schönen Link, Kalle! Werd ich sicher früher oder später mal brauchen.
Was diese Aufgabe angeht: Solange ich Zweifel dran habe, dass mir eine Datenbank Vorteile bringt, wurstel ich lieber so weiter, wie bisher. ;-)
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Hallo,
Datenbanksoftware ist für sowas optimiert. Bei grossen Datenmengen ist das jedenfalls die bessere Lösung.

Ich kenne mich mit SQL und so nicht gut aus, aber so wie ich das verstehe sehen Abfragen normalerweise sinngemäß so aus:
"Zeige mir alle Einträge aus Tabelle 'Farben', die in Spalte 'Eigenschaften' den Wert 'groß' oder 'klein' haben".
Daraus bekommst Du zB ein Array mit den Passenden Zeilen, etwaige Berechnungen (zB. Durchschnitt) würdest Du glaub ich sowieso im Programm machen. (man korrigiere mich, wenn das schon mit SQL möglich ist)

Sie bringt Vorteile zB.:
in Bezug auf performance (bei großen Datenmengen), bei der Flexibilität, bei Sicherheit, Integrität, komplexe Beziehungen zwischen Tabellen

Sie bringt Nachteile zB.:
- wenn man sich mit der entsrechenden Abfragesprache / Schnittstelle nicht auskennt, das Problem also wesentlich schneller ohne gelöst bekommt
- wenn man die Daten im ASCII format ("klartext") braucht (zB aus anderen Programmen editieren will)
- wenn das DBMS selbst unverhältnismässig viel Speicherplatz / Performance verbraucht

Performance:
Ich hab mir für Javascript als groben Richtwert gemerkt, daß es bei Textdateien mit ca. 10.000 Zeilen langsam wird (incl. suchfunktionen und DOM manipulation). Darunter überhaupt kein Problem.
Man muss aber auch die Anforderungen berücksichtigen:
Bei vielen Anfragen summieren sich auch kleinste Verzögerungen (interessieren einen Größenordnungen von Sekunden oder Milli-/Nanosekunden).

siehe:
SQL

oder Detailierter:
Relationale_Datenbank / Datenbank
Datenbanksprache / Abfragesprache
0 Punkte
Beantwortet von adalbert Einsteiger_in (65 Punkte)
Datenbanksoftware ist für sowas optimiert. Bei grossen Datenmengen ist das jedenfalls die bessere Lösung.

Das ist genau das, was mich interessiert. Optimiert für einzelne Abfragen - sicher, aber auch für eine komplette Datenbankauswertung?
Wenn ich ein eigenes Skript schreibe, wird das sicher langsam sein, aber optimiert für diese Aufgabe. D.h. es wird nur einmal durch den Datenbestand gehen, um alle Ergebnisse parallel zu ermitteln.
Wenn es so ist, wie ich befürchte, nämlich dass ich mit einer Datenbanksoftware pro Ergebniszeile ein Query brauche, werden das wahrscheinlich ca. 10 000 werden. Und ob das dann noch wesentlich schneller ist, das frage ich mich halt.

Ich hab mir für Javascript als groben Richtwert gemerkt, daß es bei Textdateien mit ca. 10.000 Zeilen langsam wird (incl. suchfunktionen und DOM manipulation). Darunter überhaupt kein Problem.

Guter Tipp. Ich werd dann mal schauen, dass ich eher mehr als grosse Dateien habe. Und ich werde es mit Perl probieren. Das soll ja angeblich so schnell sein, was Textdateien angeht.
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Ich habe mit Perl nie gearbeitet, aber ich rechne damit, daß Du da bei effizienter programmierung problemlos mit erheblich mehr als 10.000 Zeilen arbeiten kannst, sofern die Auswertung nur "gelegentlich" stattfinden soll, also seltener als alle paar Sekunden (insgesamt für alle verbundenen user!)
Ich schätze, 100.000 sollten in unter einer Sekunde abgearbeitet sein, vielleicht auch noch 10 mal soviel.

Der Vorteil "Performance" einer Datenbank greift jedenfalls erst bei sehr viel mehr Daten pro Zeit. (Bei den anderen Vorteilen ist das ggf. was anderes)
0 Punkte
Beantwortet von adalbert Einsteiger_in (65 Punkte)
Danke Kicia! Da war ich wohl ziemlich schief gewickelt. Ich hatte mit einer Laufzeit von einem Tag oder noch länger gerechnet.
Da die Auswertung nur ein einziges Mal stattfindet und ich lediglich ca. 300.000 Zeilen/Datensätze habe sollte das also in 3 Sekunden durchgelaufen sein.
Ok, ich bin kein Programmierer und meine Hardware ist auch schon älter, aber wenns ne Stunde dauert ist das auch kein Thema. Man wird sehen...
0 Punkte
Beantwortet von kjg17 Profi (34.4k Punkte)
Hallo,

300.000 Datensätze, na das wird ein Spaß.

Dein o.a. recht simples Beispiel ergibt 9 verschiedene Kombinationen und jeder Datensatz ist in 3 dieser Kombinationen zu erfassen. Macht durchschnittlich pro Kombination 100.000 zu erfassende Preise. Zur Ermittlung des Durchschnittspreises muss man lediglich die jeweiligen Preise summieren, die erfassten Datensätze hochzählen und anschließend die Summe der Preise durch die Anzahl der Datensätze teilen. Dies ist per Script vermutlich kein Problem, das taucht erst auf, wenn die Standardabweichung berechnet werden soll, denn dazu müssen die einzelnen Preise herangezogen werden.

So wie ich das sehe müsstest du bei deinem Script die durchschnittlich 100.000 Einzelpreise bei 9 möglichen Kombinationen als trennzeichengetrennte Wertereihe in jeweils eine Variable schreiben und diese Werte dann auch wieder einzeln auswerten können, um die jeweilige Standardabweichung zu berechnen.

Das Pferd ist in diesem Fall ausnahmsweise von hinten aufzuzäumen und zunächst einmal zu klären, mit welcher 'normalen' Scriptsprache überhaupt die Berechnung von Standardabweichungen möglich ist und wie man das hinbekommt, wenn nicht alle Datensätze einer wie auch immer beschaffenen Tabelle dafür herangezogen werden sollen. Erst dann steht fest, wie die Daten per Script aufbereitet werden müssen um sie mit dem selben Script auch entsprechend auswerten zu können.

Du möchtest das ja in einem Durchlauf und ohne zusätzliche Tabellen bzw. Dateien erledigen und dann geht das nur über eine Reihe von Variablen, welche vom Script temporär erstellt, mit Werten 'bestückt' und ausgewertet, sowie teilweise per Anzeige und/oder Druck oder besser doch in eine weitere Datei wieder ausgegeben werden.

Gruß
Kalle
0 Punkte
Beantwortet von adalbert Einsteiger_in (65 Punkte)
Hallo Kalle!

Leider kann ich deinen Ausführungen nicht so ganz folgen, besonders den Berechnungen. Vor allem: Vergiss die 9 Kombinationen aus dem Beispiel. Ich schätze, dass es so gegen 10.000 Kombis werden.

Ich denke der Schlüssel für eine performante Umsetzung ist es, einen alternativen Algorithmus zur Berechnung der Standardabweichung zu benutzen, wie er z.B. auch in alten, speicherlosen Taschenrechnern benutzt wird. Der Vorteil ist, dass man Durchschnitt und Standardabweichung in einem Aufwasch ermitteln kann und nur zwei Zwischenergebnisse gespeichert werden müssen, statt der gesamten Zahlenkolonne.
0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
klingt interessant.
wenn Du fertig bist, würde mich interessieren, wie du es gemacht hast, und wie lange ungefähr die berechnung gedauert hat.
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Adalbert,

Datenbanken sind schnell! Ich habe mir mal den Spaß erlaubt eine Tabelle mit 1.000.000 Datensätzen zu erzeugen dazu habe ich eine Tabelle (Tabelle1) definiert mit
[list]
ID Autowert
Farbe Text 20Zeichen
Größe Text 20Zeichen
Preis Währung
[/list]
und mit folgender Routine mit Daten gefüllt:

Public Sub FarbeGrößePreis()
Dim rec As New ADODB.Recordset
Dim farbe(9) As String
Dim groesse(9) As String

farbe(0) = "Egal"
farbe(1) = "Rot"
farbe(2) = "Blau"
farbe(3) = "Grün"
farbe(4) = "Gelb"
farbe(5) = "Lila"
farbe(6) = "Braun"
farbe(7) = "Orange"
farbe(8) = "Weiss"
farbe(9) = "Schawrz"

groesse(0) = "Egal"
groesse(1) = "super mini klein"
groesse(2) = "mini klein"
groesse(3) = "klein"
groesse(4) = "Normal"
groesse(5) = "etwas groß"
groesse(6) = "groß"
groesse(7) = "extra groß"
groesse(8) = "rießig"
groesse(9) = "Super extra rießig"

Dim i As Long

Randomize
rec.Open "select * from Tabelle1", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

For i = 1 To 1000000
rec.AddNew
rec!farbe = farbe(CInt(Rnd(1) * 9))
rec!größe = groesse(CInt(Rnd(1) * 9))
rec!Preis = CInt(Rnd(1) * 10000)
rec.Update
Next
rec.Close
Set rec = Nothing
End Sub

Darauf habe ich eine Abfrage definiert:

SELECT
Tabelle1.Farbe,
Tabelle1.Größe,
Count(Tabelle1.ID) AS AnzahlvonID,
Avg(Tabelle1.Preis) AS Mittelwert,
StDev(CInt([Preis])) AS Abweichung,
Min(Tabelle1.Preis) AS minPreis,
Max(Tabelle1.Preis) AS MaxPreis
FROM Tabelle1
GROUP BY Tabelle1.Farbe, Tabelle1.Größe;

Auf Grund der 10 Farben und 10 Größen ergibt das 100 Kombinationen mit Mittelwert, Abweichung, minimaler Preis, maximaler Preis, die mein Rechner in weniger als 15 Sekunden ausspuckt, zugegeben ein schneller Rechner.

Du siehst, es lohnt sich über Datenbanken nachzudenken.

Gruß
Ralf
...