Antworten auf deine Fragen:
Neues Thema erstellen

Inhalt einer zelle untereinander anzeigen statt nebeneinander

M

mortimer

Guest

moinsen,

folgendes, ich hab in meiner mysql tabelle 2 spalten, in der 1tn der name, in der 2ten dazugehörige bestandteile
zb:
A | B
name | zutat1 zutat 2 zutat3 zutat4 usw...

wenn ich ne normale abfrage machen, bekomm ich die tabele wie oben, gäbe es ne mögichkeit dass in spalte B die zutaten untereinander stehen?
also:
A | B
name | zutat1
| zutat2
| zutat3
| usw...

thx für die hilfe
 

Duddle

Posting-Frequenz: 14µHz

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Du hast deine Datenbank falsch entworfen, jede Spalte sollte nur exakt 1 Datum beinhalten. Das nur als Nebenbemerkung.

Ja, du kannst das machen. Pseudocode:
Code:
für jedes Rezept:
    Sei zaehler = 0
    Trenne Zutatenliste in Einzelbestandteile
    für jede Zutat:
        falls zaehler = 0:
            Ausgabe Rezeptname, Zutat
        sonst:
            Ausgabe Zutat
        inkrementiere zaehler


Duddle
 

owieortho

Aktives Mitglied

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Deine Tabelle widerspricht korrektem Datenbankdesign. Korrekt wäre:
Gericht|Zutat|Menge
Eierkuchen|Milch|500ml
Eierkuchen|Eier|4 Stück
Eierkuchen|Mehl|250g
usw.

hiermit kannst Du dann auch mit einer foreach-Schleife die einzelnen Zutaten untereinander listen.

P.S. ob das Eierkuchen-Design stimmt, weiss ich nicht, ich mach sowas nach Gefühl
 

Duddle

Posting-Frequenz: 14µHz

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

P.S. ob das Eierkuchen-Design stimmt, weiss ich nicht, ich mach sowas nach Gefühl

Du wiederholst etwas explizit, das weist in der Regel auf einen Fehler (-> unnötige Redundanz) hin. Im vorliegenden Fall haben (falls ich jetzt nichts übersehe) wir Rezepte und Zutaten.
Jedes Rezept hat mehrere Zutaten, jede Zutat ist Bestandteil mehrerer Rezepte. Das ist eine n:m-Beziehung und die wird mit einer Hilfstabelle aufgelöst:

- Tabelle Rezept mit ID, Name (und/oder Bezeichnung)
- Tabelle Zutat mit ID, Name
- Tabelle Zutat_in_Rezept mit Rezept_ID (Fremdschlüssel auf ID in Rezept), Zutat_ID (Fremdschlüssel auf ID in Zutat)

Einfacher (und in 3. NF) geht es wohl kaum.


Duddle
 

owieortho

Aktives Mitglied

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Du wiederholst etwas explizit, das weist in der Regel auf einen Fehler (-> unnötige Redundanz) hin. Im vorliegenden Fall haben (falls ich jetzt nichts übersehe) wir Rezepte und Zutaten.
Jedes Rezept hat mehrere Zutaten, jede Zutat ist Bestandteil mehrerer Rezepte. Das ist eine n:m-Beziehung und die wird mit einer Hilfstabelle aufgelöst:

- Tabelle Rezept mit ID, Name (und/oder Bezeichnung)
- Tabelle Zutat mit ID, Name
- Tabelle Zutat_in_Rezept mit Rezept_ID (Fremdschlüssel auf ID in Rezept), Zutat_ID (Fremdschlüssel auf ID in Zutat)

Einfacher (und in 3. NF) geht es wohl kaum.


Duddle
Richtig, jedoch meinte ich mit Eierkuchen-Design eher, ob sich mit 500ml Milch, 4 Eiern und 250g Mehl vernünftige Eierkuchen herstellen lassen...
 

saila

Moderatorle

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Hi,

habe mir eben einmal eine Rezepttabelle durch den Kopf gehen lassen (ist auch wieder aus :) ). Allerdings komme ich ledigich zu einer n:n Beziehung.

Rezept-Tabelle:
--------------------------
| id | Rezept-Title |
--------------------------

Rezept-Zutaten
------------------------------------
| id | Rezept-Id | Zutaten |
------------------------------------

Ob die Zutaten nun in mehrere Spalten aufgenommen werden müssten, wage ich zu bezweifeln, da man ansonsten eine weitere Tabelle mit allen möglichen Einzel-Zutaten anlegen müsste. Und selbst wenn es so wäre, könnte man das genannte Model dennoch wählen, da in der Rezept-Zutaten-Tabelle im Feld Zutaten diese wieder serialisiert abgelegt werden könnten.

Zudem wäre es möglich, zu einem Rezept, mehrere Zutaten-Varianten ablegen zu können.
Das ganze ohne Foreign-Key, da ein Rezept ja öfters in unterschiedlichen Varianten erstellten werden kann.

Das Prinzip von dir Duddle habe ich bzgl. n:m nicht oder noch nicht verstanden.

Hingewiesen sei auch darauf, dass beim verwenden von sogenannten foreign key, es beim löschen als auch bei der verweisenden Tabelle der fehlende key zu problemen führen kann. In manchen Fällen doch schon größere Probleme entstehen - insbesondere beim löschen.
 

Duddle

Posting-Frequenz: 14µHz

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Allerdings komme ich ledigich zu einer n:n Beziehung.

Eine viele-zu-viele-Beziehung kannst du auch als n:n bezeichnen, aber das suggeriert, dass beide Seiten der Relation die exakt gleiche Kardinalität haben: 1 Rezept hat exakt n Zutaten, eine Zutat ist Bestandteil von exakt n Rezepten, und das ist ja i.d.R. falsch. Deshalb wird diese Beziehung normalerweise als n:m bezeichnet.

Ob die Zutaten nun in mehrere Spalten aufgenommen werden müssten, wage ich zu bezweifeln, da man ansonsten eine weitere Tabelle mit allen möglichen Einzel-Zutaten anlegen müsste.

Ein Ziel der Normalisierung ist das Entfernen von Redundanzen. Jede Information sollte nur einmal gespeichert werden, der Rest sollte nur auf diesen Eintrag verweisen.
Mini-Beispiel: Es gibt die Rezepte A mit Zutaten Z1, Z2 und B mit Z2, Z3. Würdest du das jetzt als (A; Z1, Z2), (B; Z2, Z3) speichern, hast du offensichtlich Z2 mehrfach geschrieben. Was aber, wenn du Z2 verändern musst (Rechtschreibfehler, o.ä.)? Dann musst du jeden entsprechenden Datensatz untersuchen, bringst vielleicht neue Fehler rein, etc.
Hättest du Z2 nur einmal gespeichert, würdest du exakt dort deine Änderung durchführen und es würde sofort für alle beteiligten Rezepte gelten.


Duddle
 
M

mortimer

Guest

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

huiii...
vielen Dank für die Antworten.
Ich wollte keine auschweifenden Grundsatzdiskussionen eröffnen.
Nun, ich sehe ein, dass mein erster Gedanke die DB mit nur 2 Spalten zu gestalten sehr abwegig ist, doch war es mein erster Gedanke es so zu gestalten, da ich a) sehr wenig Ahnung von php/mysql habe und b) dies nur nebenbei privat für mich mache.
der Gedanke mit den 2 Spalten kam daher, dass ich eine Eingabemaske haben wollte, sprich über ein Formular.

Aber ich sehe schon, ich habs mir wohl einfacher vorgestellt als es in der Tat ist ;)

Trotzdem herzlichen Dank für eure Mühen

lg,
mortimer
 

saila

Moderatorle

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Hi Duddle,

danke für die Infos. Werde mich noch einmal tiefer in das Buch der MySql-Optimierung lesen :) Wobei ich den Ansatz nun zwar verstehe. Doch mit dem Beispiel n:m wird die Datenbank ja nutzlos aufgebläht und man hat zwar jedes Rezept mit der jeweiligen Rezeptur einmal in der Datenbank. Wobei ich das bei meinem Beispiel n:n (eben mit der Erweiterungsmöglichkeit) ein Rezept auch nur einmal enthalten habe und die Rezeptur ebenfalls auch nur einmalig vorhanden ist. Zwr bezugnehmend zu einem Rezept,

Und wie stehst du zu den Foreign-Keys?

@mortimer,

um herauszufinden, was geeignet ist oder was nicht, ist ab und an eine Diskussion erforderlich. Nicht um sonst gibt es immer unterschiedliche Ansätze um eine Lösung zu fahren ;)
 

Duddle

Posting-Frequenz: 14µHz

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Aber ich sehe schon, ich habs mir wohl einfacher vorgestellt als es in der Tat ist ;)

Dich zwingt ja niemand zu einem gescheiten Datenbankentwurf. Du ersparst dir aber in der Zukunft einiges an Kopfschmerzen, wenn du dein System auf ein stabiles und erweiterungsfähiges Grundgerüst baust. Investiere am Anfang mehr Zeit und Gehirnschmalz, später sind die Fehler nur schwer auszubügeln.
Und drei Tabellen sind ja nicht wirklich das größte System der Welt, ne ;)

mit dem Beispiel n:m wird die Datenbank ja nutzlos aufgebläht
"Nutzlos" hieße ja, dass es eine kleinere und ebenso korrekte Lösung gibt ("korrekt" heißt im vorliegenden Falle "in 3. NF"). Ich bin definitiv kein Datenbankmensch, aber ich sehe keine kleinere Alternative, die die gegebene Relation richtig widerspiegelt. Deinen Ansatz habe ich nicht komplett verstanden.

Und wie stehst du zu den Foreign-Keys?
Das klingt wie eine Gretchenfrage :p Offensichtlich müssen Fremdschlüssel sein, um Anomalien vorzubeugen. Mir fällt zumindest spontan kein gutes Argument gegen den Einsatz ein.

Duddle
 
M

mortimer

Guest

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

moinsen,

ok, das mit den tabellen hab ich nun (glaub ich) verstanden. habe nun folgende angelegt:
Tabelle I
-------------------
RezeptID:
INT auto increment
Name:
TEXT
-------------------

Tabelle II
-------------------
ZutatID:
INT auto increment
Name:
TEXT
-------------------

Tabelle III
-------------------
RezeptID:
INT
ZutatID:
INT
Menge:
TEXT
-------------------


Da ich wie gesagt nur rudimentäre php kenntnisse habe, aber dies gerne verwirklichen würde, wärs nett, wenn mir jmd helfen könnte zum einen die abfrage mit ausgabe zu erstellen und noch eine art Formular mit dem man das rezept eingeben kann, wobei je nach rezept die anzahl an zutaten variieren kann.

ich danke schonmal im vorraus :)
 

saila

Moderatorle

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Es bleibt dir übelassen, wie und welche Tabellen du anlegen willst. Aber beschreibe doch einmal, wie ein Rezept aufgebaut ist, wenn man es von Hand schreiben würde.

Da gibt es die Überschrift des Rezept (id, title), dann wird in aller Regel die Rezeptur benannt (id, rezeptId, rezept) und es gibt die Rezeptumsetzung in Form eines Textes (id, rezepturId, rezeptText)

Somit wäre das von dir gewählte Design schon mit einem Schwachpunkt bestückt bzgl. des Rezeptur-Text.

Der von mir nun genannte Aufbau wäre z.B.:
rezept:
--------------------------------------------------
| id (int) | rezeptTitle varchar(250) |
--------------------------------------------------

rezeptZutaten:
-------------------------------------------------------
| id (int) | rezeptId (int) | zutaten (text) |
-------------------------------------------------------

rezeptUmsetzungsText:
------------------------------------------------------------------------------
| id (int) | zutatenId (int) | rezeptErstellungsText (text) |
------------------------------------------------------------------------------

Ist ein Vorschlag ggf. ist es der gleiche wie deiner. Nur fehlen mir in deinem Beispiel irgendwie Bezugspunkte von der ein oder anderen Tabelle.


@Duddle,

vielleicht reden wir doch noch von dem ein und dem selben und ich habe lediglich das n:m in n:n gewandelt. Das Nutzlos bezog sich auf n:m, da für z.B. den einen Rezept-Titel wie Käsekuchen dadurch x Einträge in der Haupttabelle vorhanden wären. Das meinte ich mit Nutzlos und wüde auch die (nach meiner Meinung) Struktur sonst wohin führen.

Zu dem Foreign-Key - bis dato habe ich zwar über Symfony damit Kontakt erhalten, allerdings ist mir das irgendwie nicht geheuer. Insbesondere dann, wenn es um das löschen von DB-Tabellen-Einträgen oder einem Eintrag geht. Ansonsten hat sich mir der Einsatz dieser Schlüssel noch vollends eröffnet.
 
Zuletzt bearbeitet:
M

mortimer

Guest

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

im prinzip glaube ich meinte ich es mit meinem tabellen beispiel genau so wie du.
nur mal ein bsp, nehmen wir mal die eierkuchen:
Gericht|Zutat|Menge
Eierkuchen|Milch|500ml
Eierkuchen|Eier|4 Stück
Eierkuchen|Mehl|250g

Eierkuchen wäre ja in der ersten Tabelle:
ID| RezeptName
1 | Eierkuchen

in der 2ten Tabelle die Zutaten:
ID | Zutat
1 | Milch
2 | Eier
3 | Mehl

in der 3ten dann:
Rezept ID (aus Tabelle 1) | Zutat ID (aus Tabelle 2) | Menge
1 | 1 | 500 ml
1 | 2 | 4 Stück
1 | 3 | 250 g


mir ist klar, dass ich dadurch beim eintragen doppelte Zutaten in der letzten Tabelle haben werde, aber ich denke, dass sich die Abfrage, bzw das Eintragen nur verkomplizieren würde.
Von daher würde ich in kauf nehmen, dass Zutaten doppelt in der Tabelle vorhanden sind.
Die Abfrage würde nur nach dem Rezeptnamen laufen, was wahrscheinlich die Abfrage vereinfacht, oder geh ich da ganz falsch in der Annahme?

Ausgegeben hätte ich das ganze dann so ähnlich:
+-------------+---------+-------+
| Eierkuchen |.. 500 ml | Milch.. |
| .............. | 4 Stück .| Eier.....|
| ...............| 250 g ....| Mehl...|
+-----------+---------+-------+
(.... = leer)
 
Zuletzt bearbeitet von einem Moderator:

Duddle

Posting-Frequenz: 14µHz

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

die abfrage mit ausgabe zu erstellen

Du hast deine Tabellennamen nicht genannt, deshalb nutze ich mal Pseudo-Bezeichnungen, die du anpassen musst:

Code:
SELECT `Rezepte`.`Name`, `Zutaten`.`Name`, `ZutatenInRezepten`.`Menge`
FROM `Rezepte`
JOIN `ZutatenInRezepten` ON `Rezepte`.`id` = `ZutatenInRezepten`.`RezeptID`
JOIN `Zutaten` ON `Zutat`.`id` = `ZutatenInRezepten`.`ZutatID`
ORDER BY `Rezepte`.`Name`

Die Backticks benutze ich, weil ich damit bisher immer ganz gut in MySQL gefahren bin. Das ORDER BY muss am Ende nicht sein, aber du willst es sicher sortiert haben (bzw. das kannst du ja parametrisieren).

Die Abfrage selbst sollte dich vor keine Schwierigkeiten bringen: Rezepte auf ZutatenInRezepten joinen, das Zwischenergebnis mit Zutaten joinen. Sehr straightforward.

Das Eintrage-Formular sollte dich auch keine 2h dauern. Am einfachsten wären 3 getrennte Abschnitte: einer zum Blanko-Rezept-Anlegen, einer zum Blanko-Zutat-Anlegen, einer zum füllen des Rezeptes mit (aus der DB geholten) verfügbaren Zutaten plus entsprechenden Mengen.
Eleganter wäre es mit einem einzigen, großen Formular - aber du musst es ja nicht übertreiben.

Edit:
Von daher würde ich in kauf nehmen, dass Zutaten doppelt in der Tabelle vorhanden sind.
Das stimmt so nicht. Da RezeptID und ZutatenID einen Verbundschlüssel bilden (ich hoffe, du hast das so eingerichtet), kannst du das als eine Information auffassen. Du speicherst einmalig und eindeutig, dass beispielsweise Rezept 5 und Zutat 8 zusammengehören. Das wirst du nie wiederholen, du hast keine echten Dopplungen.


Duddle
 
Zuletzt bearbeitet:
M

mortimer

Guest

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

hey,

danke für die schnelle Antwort, wenn ich das so lese, klingt das alles logisch, nur muss man eben selber mal drauf kommen, wenn man kaum ahnung davon hat ;)

ich werd mal was zusammenstellen morgen und berichte dann mal.
 

saila

Moderatorle

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Ich bleibe dennoch bei der Meinung, das dies lediglich ein Grundkonzept für das Datenbank-Design ist. Es ist weder in Gänze ausgedacht noch sind alle erforderlichen Bestandteile vorhanden.

Ein Beispiel. Was ist, wenn z.B. das Rezept Käsekuchen noch eine Ergänzung benötigt wie z.B. Käsekuchen mit Rosinen. In diesem Augenblick ist das eigentl. Rezept "Käsekuchen" zwar noch passen, doch wo ist nun das Unterscheidungsmerkmal zu den anderen Käsekuchen in der Tabelle der Rezept-Zutaten?

Und wenn ich nur an ein Roggenbrot oder Sauerteigbrot denke, dann eröffnen sich mir bereits mind. 5 unterschiedliche Rezepte, welche auch in der Datenbank oder in der späteren Ausgabe auch dargestellt werden können ;)
 

Duddle

Posting-Frequenz: 14µHz

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Was ist, wenn z.B. das Rezept Käsekuchen noch eine Ergänzung benötigt wie z.B. Käsekuchen mit Rosinen.

Die sind zwar ähnlich, aber nicht gleich. Ein Käsekuchen mit Rosinen hat andere Zutaten, andere Mengen und eine andere Zubereitungsart als ein normaler Käsekuchen. Das eine mag zwar mit dem anderen verwandt sein, aber das heißt nicht, dass man sie nicht auch getrennt behandeln kann.

Sicherlich könnte man auch eine "Vererbung" entwerfen, aber das macht das System meiner Meinung nach unnötig kompliziert und ist nur in wenigen Fällen tatsächlich nützlich.


Duddle
 

Chriss1987

me.drinkCoffee();

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Hi,

hab den Thread mal ein wenig verfolgt und kann Duddle zustimmen. Der jetzige Stand mit 3 Tabellen (Rezept, Zutat, Reztat^^) ist meiner Meinung nach sinvoll und auch skalierbar. salia, ich kann dich verstehen, dass du gerne ähnliche Rezepte auf eine Basis bringen willst (programmierst du sonst in höheren Programmiersprachen, bzw. OO? ;-) ), aber eine Vererbung würde, wie Duddle schon sagte, das ganze unnötig kompliziert machen. Wird z.B. beim Käsekuchen eine Zutat verändert, die nur in diesem Käsekuchen zu finden ist, müsste die Basis (Zutaten entfernt) und somit alle davon abhängigen Rezepte (fehlende Zutat hinzu) geändert werden. Behandelt man ein Rezept als eigenständig und nicht vererbbar, müsste nur das betreffende Rezept verändert werden und alle anderen wären davon unberührt.

Im späteren Design-Verlauf könnte man aber sehr wohl Funktionen implementieren, die quasi ein bestehendes Rezept kopieren, sodass man sich Arbeit sparen kann. Auch eine Massenänderungsfunktion (mehrere Rezepte auswählen und nur die Schnittmenge an Zutaten anzeigen lassen) könnte implementiert werden, was mMn deutlich einfacher ist, als eine Vererbungshierachie in der DB.

Noch ein kleiner Tipp, um sich die Beziehungen beim DB-Entwurf zu visualisieren:
MySQL :: MySQL Workbench 5.2
Ich finde, damit kann man seine DB recht übersichtlich gestalten und anlegen! ;)

Schöne Grüße aus dem Sauerland!
Chriss (der jetzt hunger auf Käsekuchen hat.. ;) )

Käsekuchen ohne Boden
Zutaten:

1 kg Quark (abtropfen lassen)
125 g Butter oder Margarine
375 g Zucker
1 1/2Pck. Vanille Puddingpulver
2 Pck. Vanillezucker
1 Pck. Backpulver
4 Eier
Saft aus 2 frischen Zitronen

Alles verrühren, eine Springform einfetten und mit Paniermehl auskleiden.
Bei 170° (Umluft) 1 Stunde backen.
 
M

mortimer

Guest

AW: Inhalt einer zelle untereinander anzeigen statt nebeneinander

Hach... ihr seid echt lieb ;)
nur bekomm ich das ganze nicht hin
also habe ich nun folgende Tabellen:
I
"Rezepte" bestehend aus: RID (INT Primary Key auto increment) und Rezeptname
II
"Zutaten" bestehend aus ZID (INT Primary Key auto increment) und Zutat
III
Menge bestehend aus RID, ZID (INT beide Primary Key) und Menge

Mit der Abfrage oben bekomm ich das genaze nicht hin, geschweige denn eine Ausgabe..

eine einfache Tabelle mit 3 Spalten klappt, und hab ich auch hinbekommen, nur mit den ganzen JOIN ON zeugs komm ich net klar.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.613
Beiträge
1.538.345
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben