Python Entwurf?
Servus, ich muss für die Uni eine Webanwenung mit React, Pyhton, einer Datenbank ect. entwickeln. Folgende Aufgabenstellung:
Es soll ein System sein, beidem man Rezepte und Lebensmittel verwalten kann. Konkreter:
- Anlegen, Editieren und Löschen von Rezepten, Mengenangaben für Lebensmittel, Personen, Lebensmittel, Haushalte und deren Kühlschrank sowie Maßeinheiten,
- Zuordnungen zwischen den unter Zif. 1 genannten Elementen. Für den Umgang mit Nutzerdaten soll auf die Google Firebase Authentication-API zurückgegriffen werden.
- Abfrage, welche Rezepte mit dem aktuell im Kühlschrank befindlichen Vorrat zubereitet werden könnten,
- Abfrage, welche den aktuellen Vorrat ergänzenden Einkäufe (Lebensmittel inkl. Mengenangaben) zu tätigen sind, um ein gewünschtes Rezept zubereiten zu können.
- Verwalten des Kühlschrankinhalts durch Befüllen (infolge des Einkaufs) und Entnahme (aufgrund Zubereitung anhand Rezept).
Nun habe ich ein paar fragen speziell zum Backend und mal ein grobes Klassendiagramm entwickelt:
Es muss wohl so sein, dass die Mengeneingabe und die Maßeinheit jeweils eine Klasse abbilden. Ich bin mir nur nicht sicher, wie man das umsetzen könnte. Im Klassendiagramm ist mal eine Idee von mir drin. Jedoch wirkt das auf mich irgendwie nicht ganz richtig.
Falls mir jemand helfen könnte, wäre ich echt dankbar!
1 Antwort
Jedes Lebensmittel hat eine eigene Maßeinheit.
Eine Maßeinheit kann bei mehreren Lebensmitteln vorkommen.
Also muss eine n-1 Verbindung von Lebensmittel zu Maßeinheit.
Ansonsten sollte die Maßeinheit mit nichts verbunden sein.
Einfaches Beispiel, damit du's verstehst:
Das Lebensmittel "Ei" hat die Maßeinheit "Stück", das Lebensmittel "Milch" hat die Maßeinheit "ml".
In der Lebensmittelliste brauchst du dann Einträge die eine Kombination aus Lebensmittel und Quantity darstellen. Quantity muss keine extra Tabelle sein, dafür reicht eine Spalte.
500 Milch (-> ml)
3 Ei
...
Ich würde dafür eine Tabelle Listeninhalt machen (wobei ich die Sachen persönlich eher auf englisch benennen würde, aber das ist egal):
ListenID | LebensmittelID | Quantity
ABCD-1234 | Egg | 5
ABCD-1234 | Milk | 500
ASDF-3214 | Bread | 1
ASDF-3213 | Egg | 6
In dieser Tabelle steht dann also, in welcher Liste welche Lebensmittel in welcher Menge vorhanden sind. PK ist logischerweise die Kombination aus (ListenID, LebensmittelID), weil es pro Liste pro Lebensmittel einen Eintrag geben kann.
Jedem Lebensmittel würde ich wie du siehst eine ID geben, um es eindeutig zu identifizieren. Sowas anhand der Bezeichnung zu machen ist keine gute Idee, weil was ist, wenn du die App mal Mehrsprachig machen möchtest. Als ID verwendet man normalerweise eine automatisch generierte 128-bit UUID (lässt sich in VARCHAR(36) speichern), in dem Beispiel hier habe ich aber einfach selbst-vergebene IDs wie "Egg" oder "Milk" genommen, kann man natürlich auch machen wenn man nicht viele Daten hat.
Im Klassendiagram musst du die ListenID beim Inhalt natürlich nicht darstellen. Da gibst du der LebensmittelListe einfach eine List<Listeninhalt>, das hast du eh schon richtig.
Genau, ja.
Ich denke da kannst du die Listen wiederverwenden.
Jedes Rezept hat eine Lebensmittelliste (1 -> 1)
Jeder Kühlschrank hat eine Lebensmittelliste (1 -> 1)
Achja was mir grad noch aufgefallen ist: Lebensmittel zu Maßeinheit ist natürlich n:1 nicht 1:1. Eine Maßeinheit kann ja bei mehreren Lebensmitteln verwendet werden. Stück -> Brot, Stück -> Eier.
Alles klar, danke :) Zum Glück hast du das nochmal mit der Multiplizität zwischen Maßeinheit und Lebensmittel gesagt, ich war nämlich grad beim erstellen etwas verwirrt und habe dann alles bezüglich der Mulitplizitäten in Frage gestellt xD
Haha ja, is mir zum Glück noch aufgefallen grad xD
Das muss man immer schön in beide Richtungen durchdenken :D
Danke dir!! Zum Punkt der ID: ich will für die Datenbank sowieso ein BusinessClassObject erstellen, wovon die meisten oder wahrscheinlich auch alle Klassen erben werden. Diese soll jeder Klasse eine ID zuweisen. Ansonsten mach ich alles auch noch auf Englisch
Kann man so machen, ja 👍
In meinen Augen beschreibt ein Klassendiagramm den Aufbau der Datenbank (oder es ist zumindest dazu gedacht, die Datenbank und die darin vorhandenen relationalen Beziehungen zu planen), heißt ich würde die ID da überall manuell mit dazu packen, anstatt eine extra Klasse nur mit ID darzustellen. Weil in Datenbanken gibt es keine Vererbung.
Aber vlt. checkt dein Prof was gemeint ist oder ihr dürft das so machen oder ich hab's falsch in Erinnerung, dann egal :D
Ich glaub bei uns war das ok, aber man musste beim entsprechenden Klassennamen "extends BusinessClassObject" mit dazu schreiben.
Ok nevermind hab glaub ich Quatsch erzählt, passt schon so.
Aber ich glaub die Vererbung musst du trotzdem iwie kennzeichnen :D
Pfeil mit <extends> oder so :D
Du meinst also ich sollte einfach nur die Maßeinheit mit dem Lebensmittel verbinden und erst wenn es zu einem Eintrag kommt, Quantity nutzen?
Genau, ja. Ich ergänze eben noch in der Antwort, wie ich die Einträge speichern würde
Ja ich werde die Klasse BO noch hinzufügen und des aufzeigen. Noch eine Frage: Beim erstellen/editieren eines Rezeptes könnte ich ja genauso vorgehe. Also ein Rezept stellt eine Liste dar, dass aus den Lebensmittel-IDs und den Mengenangaben besteht, oder wie würdest du das handhaben?