radi
2021-03-08, 09:17:43
Hi Leute,
ich baue mir eine kleine Website, mit der ich über Zutaten und Rezepte meinen Essensplan und den Wocheneinkauf managen möchte. Ja ich weiß, sowas gibt's schon aber ich möchte mich einfach weiterbilden und mir selbst mal sowas aufbauen :)
Dazu habe ich mit Python und Flask mir eine eine Website aufgebaut mit einer Datenbank dahinter. Das klappt auch bisher alles super nur ich habe das Gefühl, dass ich das, was DB eigentlich ausmacht (Relationships und Abhängigkeiten zB), gar nicht richtig nutze.
Ich habe aktuell folgendes DB-Konstrukt (in vereinfachter Form):
Zutat:
- ID
- Name
- Energy_kcal (pro 100g)
Rezept-Zutat:
- ID
- Name
- Zutaten-ID (über foreign key/relationship)
- Menge
- Energy_kcal
Rezept:
- ID
- Rezept-Zutaten-Ids (über foreign key/relationship)
- Portionen
- Energy_kcal
Ich berechne dann in jedem Schritt, wenn ich über die Form-Interfaces ein Objekt erstelle dann auch immer, auf Basis der Ebene darunter, bspw. die Kalorien und gebe diese dem Objekt explizit mit. Das heißt: Wenn ich ein Rezept erstelle, selektiere ich die Zutaten und kombiniere sie mit einer Menge (--> Rezept-item). Dadurch hat die Rezept-Zutat eine mengenspezifische Energie, denn die energieangaben der Zutaten sind, wie es von der Nähwerttabelle bekannt, auf 100g bezogen. dadurch kann ich bspw. (neben anderen Attributen wie Preis, Fett/Carbs in g) angeben, wieviel kcal das Rezept pro Portion hat, denn das Rezept bekommt die Info, für wieviel Portionen noch die Mengen angaben sind. Kenn man alles von Chefkoch oder allen anderen Rezeptseiten.
Jetzt frage ich mich aber, ob das wirklich so gedacht ist, dass ich die Energie (hier als Beispiel) dem Rezept mit einem harten Wert in einer Spalte ablege. Ich verstehe es eigentlich so, dass ich durch die Verknüpfung (über foreign key/relationship) zwischen den Ebenen dann auf die Infos der verknüpften Klassen zugreifen kann. Hier weiß ich dass ein Rezept mit Zutaten verknüpft ist. Das Spiel geht dann auch noch weiter, wenn ich meinen Essensplan weiter aufbauen möchte. Der soll nämlich wie folgt aussehen:
Essensplan >>> Tag >>> Mahlzeit >>> Rezept * Portionen >>> Zutaten für eine Anzahl an Portionen
Am Ende möchte ich z.B. aufschlüsseln können, welche Zutaten (in welcher Menge) ich pro Plan und/oder pro Plan und/oder pro Mahlzeit brauche. Auch möchte ich angeben können was für ein Ernährungsmakro am Ende pro Plan / Tag / Mahlzeit rauskommt, wenn ich die Info Carbs/Fett/Protein über Zutatenwerte betrachte.
Ich denke es sollte eher so sein, dass man sich über die Relationships bspw. von einem Tag aus über Mahlzeit und Rezept so durchhangelt und sich dann am Ende die Werte für bspw Kalorien aus der Zutateninfo rauszieht und nicht schon die Info vorab berechnet hat für den Tag.
So sehen aktuell meine Models aus:
(richtig implementiert ist es bis zur Rezepterstellung)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(150), unique=True)
password = db.Column(db.String(150))
first_name = db.Column(db.String(150))
# relations
plans = db.relationship("Plan")
recipes = db.relationship("Recipe")
class Plan(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
date = db.Column(db.DateTime(timezone=True), default=func.now())
# relations
days = db.relationship("Day")
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
class Day(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
# relations
meals = db.relationship("Meal")
plan_id = db.Column(db.Integer, db.ForeignKey("plan.id"))
class Meal(db.Model):
id = db.Column(db.Integer, primary_key=True)
portions = db.Column(db.Numeric)
prize = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
energy_kJ = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
carbs = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
type = db.Column(db.String(30))
# relations
recipe = db.relationship("Recipe")
day_ids = db.Column(db.Integer, db.ForeignKey("day.id"))
class Recipe(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
author = db.Column(db.String(50))
duration = db.Column(db.Numeric)
difficulty = db.Column(db.String(50))
instruction = db.Column(db.String(10000))
date = db.Column(db.DateTime(timezone=True), default=func.now())
portions = db.Column(db.Numeric)
# cost and caloric information per portion
cost = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
energy_kJ = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
carbs = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
category = db.Column(db.String(30))
# relations
recipeitems = db.relationship("Recipeitem")
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
meal_ids = db.Column(db.Integer, db.ForeignKey("meal.id"))
class Recipeitem(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
amount = db.Column(db.Numeric)
# prize and caloric information absolut (per Item)
prize = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
energy_kJ = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
carbs = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
type = db.Column(db.String(30))
# relations
ingredient = db.relationship("Ingredient")
recipe_ids = db.Column(db.Integer, db.ForeignKey("recipe.id"))
class Ingredient(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
brand = db.Column(db.String(30))
type = db.Column(db.String(30))
# prize and caloric information absolut (per 100g)
prize = db.Column(db.Numeric)
energy_kj = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
carbohydrates = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
date = db.Column(db.DateTime(timezone=True), default=func.now())
# relations
recipeitem_ids = db.Column(db.Integer, db.ForeignKey("recipeitem.id"))
Ich mache das nebenher und habe das weder akademisch noch professionell gelernt, sowas in einer echten Datenbank abzubilden, deshalb bin ich mir unsicher wie es richtig geht. Könnt ihr mir da weiterhelfen, damit ich da besser durchsteige, wie man so ein System richtig aufbaut und nutzt?
Ich wäre euch so dankbar!
Viele Grüße,
radi
ich baue mir eine kleine Website, mit der ich über Zutaten und Rezepte meinen Essensplan und den Wocheneinkauf managen möchte. Ja ich weiß, sowas gibt's schon aber ich möchte mich einfach weiterbilden und mir selbst mal sowas aufbauen :)
Dazu habe ich mit Python und Flask mir eine eine Website aufgebaut mit einer Datenbank dahinter. Das klappt auch bisher alles super nur ich habe das Gefühl, dass ich das, was DB eigentlich ausmacht (Relationships und Abhängigkeiten zB), gar nicht richtig nutze.
Ich habe aktuell folgendes DB-Konstrukt (in vereinfachter Form):
Zutat:
- ID
- Name
- Energy_kcal (pro 100g)
Rezept-Zutat:
- ID
- Name
- Zutaten-ID (über foreign key/relationship)
- Menge
- Energy_kcal
Rezept:
- ID
- Rezept-Zutaten-Ids (über foreign key/relationship)
- Portionen
- Energy_kcal
Ich berechne dann in jedem Schritt, wenn ich über die Form-Interfaces ein Objekt erstelle dann auch immer, auf Basis der Ebene darunter, bspw. die Kalorien und gebe diese dem Objekt explizit mit. Das heißt: Wenn ich ein Rezept erstelle, selektiere ich die Zutaten und kombiniere sie mit einer Menge (--> Rezept-item). Dadurch hat die Rezept-Zutat eine mengenspezifische Energie, denn die energieangaben der Zutaten sind, wie es von der Nähwerttabelle bekannt, auf 100g bezogen. dadurch kann ich bspw. (neben anderen Attributen wie Preis, Fett/Carbs in g) angeben, wieviel kcal das Rezept pro Portion hat, denn das Rezept bekommt die Info, für wieviel Portionen noch die Mengen angaben sind. Kenn man alles von Chefkoch oder allen anderen Rezeptseiten.
Jetzt frage ich mich aber, ob das wirklich so gedacht ist, dass ich die Energie (hier als Beispiel) dem Rezept mit einem harten Wert in einer Spalte ablege. Ich verstehe es eigentlich so, dass ich durch die Verknüpfung (über foreign key/relationship) zwischen den Ebenen dann auf die Infos der verknüpften Klassen zugreifen kann. Hier weiß ich dass ein Rezept mit Zutaten verknüpft ist. Das Spiel geht dann auch noch weiter, wenn ich meinen Essensplan weiter aufbauen möchte. Der soll nämlich wie folgt aussehen:
Essensplan >>> Tag >>> Mahlzeit >>> Rezept * Portionen >>> Zutaten für eine Anzahl an Portionen
Am Ende möchte ich z.B. aufschlüsseln können, welche Zutaten (in welcher Menge) ich pro Plan und/oder pro Plan und/oder pro Mahlzeit brauche. Auch möchte ich angeben können was für ein Ernährungsmakro am Ende pro Plan / Tag / Mahlzeit rauskommt, wenn ich die Info Carbs/Fett/Protein über Zutatenwerte betrachte.
Ich denke es sollte eher so sein, dass man sich über die Relationships bspw. von einem Tag aus über Mahlzeit und Rezept so durchhangelt und sich dann am Ende die Werte für bspw Kalorien aus der Zutateninfo rauszieht und nicht schon die Info vorab berechnet hat für den Tag.
So sehen aktuell meine Models aus:
(richtig implementiert ist es bis zur Rezepterstellung)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(150), unique=True)
password = db.Column(db.String(150))
first_name = db.Column(db.String(150))
# relations
plans = db.relationship("Plan")
recipes = db.relationship("Recipe")
class Plan(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
date = db.Column(db.DateTime(timezone=True), default=func.now())
# relations
days = db.relationship("Day")
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
class Day(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
# relations
meals = db.relationship("Meal")
plan_id = db.Column(db.Integer, db.ForeignKey("plan.id"))
class Meal(db.Model):
id = db.Column(db.Integer, primary_key=True)
portions = db.Column(db.Numeric)
prize = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
energy_kJ = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
carbs = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
type = db.Column(db.String(30))
# relations
recipe = db.relationship("Recipe")
day_ids = db.Column(db.Integer, db.ForeignKey("day.id"))
class Recipe(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
author = db.Column(db.String(50))
duration = db.Column(db.Numeric)
difficulty = db.Column(db.String(50))
instruction = db.Column(db.String(10000))
date = db.Column(db.DateTime(timezone=True), default=func.now())
portions = db.Column(db.Numeric)
# cost and caloric information per portion
cost = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
energy_kJ = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
carbs = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
category = db.Column(db.String(30))
# relations
recipeitems = db.relationship("Recipeitem")
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
meal_ids = db.Column(db.Integer, db.ForeignKey("meal.id"))
class Recipeitem(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
amount = db.Column(db.Numeric)
# prize and caloric information absolut (per Item)
prize = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
energy_kJ = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
carbs = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
type = db.Column(db.String(30))
# relations
ingredient = db.relationship("Ingredient")
recipe_ids = db.Column(db.Integer, db.ForeignKey("recipe.id"))
class Ingredient(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
brand = db.Column(db.String(30))
type = db.Column(db.String(30))
# prize and caloric information absolut (per 100g)
prize = db.Column(db.Numeric)
energy_kj = db.Column(db.Numeric)
energy_kcal = db.Column(db.Numeric)
fat = db.Column(db.Numeric)
carbohydrates = db.Column(db.Numeric)
sugar = db.Column(db.Numeric)
protein = db.Column(db.Numeric)
date = db.Column(db.DateTime(timezone=True), default=func.now())
# relations
recipeitem_ids = db.Column(db.Integer, db.ForeignKey("recipeitem.id"))
Ich mache das nebenher und habe das weder akademisch noch professionell gelernt, sowas in einer echten Datenbank abzubilden, deshalb bin ich mir unsicher wie es richtig geht. Könnt ihr mir da weiterhelfen, damit ich da besser durchsteige, wie man so ein System richtig aufbaut und nutzt?
Ich wäre euch so dankbar!
Viele Grüße,
radi