Datenbankentwurf Preishistorie

Creator-X

Benutzer
Beiträge
7
Hallo Leute,:)
ich bin Neuling in sachen Datenbank und hoffe mir kann hier jemand weiterhelfen. :rolleyes:
Ich möchte eine DB-Preise erstellen in MySQL (phpMyAdmin).
Ein ersten Entwurf habe ich gemacht und weiß aber nicht ob man das so machen kann.
In der TB habe ich mal eingetragen was für Daten ich habe.

Gruß CX
 

Anhänge

  • db Entwurf Preisentwicklung.jpg
    db Entwurf Preisentwicklung.jpg
    64,5 KB · Aufrufe: 12
Werbung:
ich sehe da keine logische Verbindung zwischen der oberen Tabelle (soll das eine Tabelle sein?) und der Base-Tabelle. Es ist allgemein sinnvoller, SQL-Statements zu zeigen
 
Zuletzt bearbeitet von einem Moderator:
Ich würde ergänzen, dass Dein Post überhaupt keine wirkliche Aufgabenstellung enthält, zumindest keine annähernd präzise.
Insofern könnte man nur antworten, ja kann man machen (abgesehen von der bereits angemerkten Frage zu der "Tabelle" im Bild, die nichts mit einem Modell zu tun hat)
 
Hallo Leute,
danke für die RM. Bitte entschuldigt grundlegende Fehler aber da ich wie schon erwähnt neu bin in der Materie DB und mich da jetzt erst einarbeite hab ich das als interessantes Thema mir überlegt.
Meine Vorhaben: Ich will alte Kassenbons in eine DB eingeben und mal schauen wie sich die Preise in abhängikeit von Ort und Geschäft entwickelt haben. :cool: Ich Dachte als Übungsbeispiel ist es ne schöne Herausforderung.:eek:
Also in der TB aus dem ersten Post hab ich mal so konstruiert was ich machen will. Nun will ich das ja in mysql machen. Ich habe vor die MySQL-DB dann über PHP anzusprechen.
In MySQL sieht das ganze aktuell aus wie auf dem Pic.
Meine Frage sollte eigentlich sein: Gibt es evetnuell eine bessere Lösung die TB miteinander, für die Aufgabe, zu verknüpfen? Oder kann es mit der Variante die ich gewählt habe eventuell später zu Problemen kommen?:confused:

Danke und Gruß CX
 

Anhänge

  • 20201229_02_db Entwurf Preisentwicklung.jpg
    20201229_02_db Entwurf Preisentwicklung.jpg
    41,4 KB · Aufrufe: 9
Das Datum als Referenz anzulegen halte ich für übertrieben, denPreis als varchar völlig falsch. Ort und Geschäft, ist das z.B. für ALDI in verschiedenen Orten?

Mit MySQL fehlen Dir vermutlich spätere Auswertemöglichkeiten wie z.B. Window-Funktionen. Das merkst Du aber erst, wenn es vermutlich zu spät ist.
 
Ok, den Wert für Preis hab ich jetzt auf Dezimal geändert.
Ja das Datum bräuchte ich doch wen ich z.B. ausgeben will wie sich der Preis von Butter über einen bestimmten Zeitraum entwickelt hat. Oder?
Das mit Ort ist eben so gemeint , da ich ja in ganz Deutschalnd in verschiedenen Städten eingekauft habe, will ich dann mal ausgeben lassen wie sich z.B. ein Produkt in abhängigkeit von der Region entwickelt hat.
Ich weiß, ist vieleicht ein bisschen absurd für den einen oder anderen aber als Bsp. denke gut geeignet. Und da ich ein haufen alte Kassenbelege habe bin ich eben auf diese Idee gekommen.
@ Windows Funktionen: ich wollte es eben nur über PHP machen da ich auch gerade noch dabei bin PHP zu lernen. und da kann ich es ja dann übern browser anzeigen lassen.
 
Es sind Window-Funktionen, nicht Windows-Funktionen, und diese in PHP zu machen ist denkbar schlecht.

Stark vereinfachte Tabelle, ohne Ort etc.:

Code:
test=# create table preise (id int generated always as identity, datum date, produkt text, preis numeric);
CREATE TABLE
test=*# copy preise (datum, produkt, preis) from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 2020-01-01   Banane   1.5
>> 2020-01-03   Banane   1.7
>> 2020-01-03   Bier   18
>> 2020-02-01   Bier   19
>> 2020-02-02   Banane   1.4
>> \.
COPY 5
test=*# select * from preise;
 id |   datum    | produkt | preis
----+------------+---------+-------
  1 | 2020-01-01 | Banane  |   1.5
  2 | 2020-01-03 | Banane  |   1.7
  3 | 2020-01-03 | Bier    |    18
  4 | 2020-02-01 | Bier    |    19
  5 | 2020-02-02 | Banane  |   1.4
(5 rows)

test=*# select *, preis - lag(preis) over (partition by produkt order by datum) as preisaenderung from preise;
 id |   datum    | produkt | preis | preisaenderung
----+------------+---------+-------+----------------
  1 | 2020-01-01 | Banane  |   1.5 |               
  2 | 2020-01-03 | Banane  |   1.7 |            0.2
  5 | 2020-02-02 | Banane  |   1.4 |           -0.3
  3 | 2020-01-03 | Bier    |    18 |               
  4 | 2020-02-01 | Bier    |    19 |              1
(5 rows)

test=*#

Angenommen, Du willst wissen, welche Dinge teuer geworden sind. Wenn Du das mit PHP machen willst, mußt Du alles in PHP reinziehen, in SQL ginge es so:

Code:
test=*# with temp as (select *, preis - lag(preis) over (partition by produkt order by datum) as preisaenderung from preise) select * from temp where preisaenderung > 0;
 id |   datum    | produkt | preis | preisaenderung
----+------------+---------+-------+----------------
  2 | 2020-01-03 | Banane  |   1.7 |            0.2
  4 | 2020-02-01 | Bier    |    19 |              1
(2 rows)

test=*#

Dies lag() - Funktion ist solche eine Window-Funktion.
 
Das mit Ort ist eben so gemeint , da ich ja in ganz Deutschalnd in verschiedenen Städten eingekauft habe, will ich dann mal ausgeben lassen wie sich z.B. ein Produkt in abhängigkeit von der Region entwickelt hat.

Hast du wandernde Geschäfte? D.h. wenn du Ort vom Geschäft abhängig machst und nicht vom Beleg kannst du zum einen auch Auswertungen über die Region erstellen und zum anderen ist das sauberer.

Ja das Datum bräuchte ich doch wen ich z.B. ausgeben will wie sich der Preis von Butter über einen bestimmten Zeitraum entwickelt hat. Oder?

Aber nicht ausgelagert in eine eigene Tabelle.
 
;) @Dukel
Ich bin beruflich oft viel unterwegs und deshalb kaufe ich mal z.B. in München, in Hamburg, Berlin ...... und so ein. Und deshalb habe ich den Ort(Region) mit angegeben.
Sonst kann ich doch nicht nach Ort filtern.
 
Wieso kannst du nicht nach Ort filtern?

Code:
SELECT preise.preis, preise.datum, geschaeft.geschaeft, ort.ort, ort.plz
FROM Preise INNER JOIN geschaeft ON Preise.geschaeft_id = geschaeft.id INNER JOIN Ort ON geschaeft.ort_id = ort.id
WHERE ort.ort = 'Berlin'

Code:
preis    datum    geschaeft    ort    plz
1.40    2020-01-01    Aldi          Berlin        10115
1.50    2020-02-01    Aldi          Berlin        10115
1.20    2020-03-01    Lidl          Berlin        10115
1.50    2020-04-01    Lidl          Berlin        10115
 
Was meintest du mit "Wandernde Geschäfte"?
Der Preis ist doch von Geschäft, Ort und Datum abhängig. Deshalb dachte ich mir es ist so am besten.
Weil es gibt ja z.B. Aldi hier so wie in anderen Städten(Regionen) oder anderen großen Ketten.
@akretschmer : Ja das ist in sql bestimmt gut zu realisieren, doch da kenn ich mich ja noch weniger aus. löl
Ich habe ja vor die TB übern Webbrowser zu befüllen und auszuwerten. So mit PHP quasi.
:confused:ich hab schon mit dem MySQL in PHPmy adminzu tun ... pphhuuu;)
 
Ich habe ja vor die TB übern Webbrowser zu befüllen und auszuwerten. So mit PHP quasi.

Ja. Das mag funktionieren mit wenigen Dutzend Datensätzen. Unsere Kunden haben typischerweise einige Dutzend TB. Damit meine ich nicht das, was Du unter TB verstehst (was eigentlich?), sondern TerraBytes, mit hunderten Millionen oder mehr Datensätzen.
Also, in dem Sinne: viel Spaß am Gerät mit Deinem Spielzeug! Man könnte es ja gleich richtig machen, man kann sich aber auch erst einmal in den Fuß ballern und sich wundern, warum das weh tut.
 
Das Geschäft hat einen festen Ort. Indirekt ist daher der Preis vom Ort abhängig. Wenn beide Informationen vom Preis abhängig sind sind diese nicht mehr voneinander abhängig und es können falsche Daten entstehen.
Wie in meinem Beispiel zu sehen kannst du immer noch nach dem Ort Filtern / Gruppieren / ...
 
@akretschmer ;)
Nun ja, ich weiß.... viele Wege führen nach Rom. Und das es immer einen besseren Weg gibt weiß ich auch. Hintergrund ist ja einfach das erlernen mit MySQL und PHP da was zu erstellen damit ich es dan auch verstehe. ;)
Und soviel Datensätze kommen da nicht zusammen. Ist ja nur für mich privat . :cool:
Also noch mal auf mein ursprünfgliches problem/ Frage zurückzukommen.
Ist das mit den Tabellen in MySQL soweit ok oder sollte ich es anders aufteilen/erstellen?:rolleyes:
 
Werbung:
@Dukel
also sollte ich Geschäft und Ort(Stadt/Dorf/etc) in eine TB packen? Ich dachte ich b in flexibler wenn ich es in zwei TB schreibe.
Und Preis und Datum könnte ich ja auch in eien TB schreiben. Oder?

Wenn ich jetz aber in PHP in der Eingabemaske ein Drop Down machen will wo ich dann aus den vorhandenen Daten gleich auswählen kann dann ist es doch aber bessser alles in EinzelTabellen zu haben. Oder nicht?
 
Zuletzt bearbeitet:
Zurück
Oben