John M.: Arrays in MySQL-Datenbank speichern und auslesen

Beitrag lesen

Das Bild heißt "schönes_Bild", soll die Schlagworte "Sonnenuntergang", "Meer" und "Strand" haben und insgesamt gibt es die Schlagworte "Sonnenuntergang", "Meer", "Strand", "Düne", "Wolken".
Dann sehen der erste Datensatz ja so aus:

bild

1 (id_bild)
"schönes_Bild" (bildname)

Genau.

Aber dann? Was bedeutet "bild_aspekt"? Ich verstehe, dass id_bild dann identisch ist, aber was ist nun id_aspekt? Und was ist der dritte Datensatz?

Du hast eine zweite Tabelle, welche die Beziehung zwischen dem Einzelbild und der dritten Tabelle (die mit den Kategorien) herstellt. Ohne diese 2. Tabelle ist das ganze Konzept Unsinn, da Du zwei völlig unabhängig nebeneinander stehende Tabellen hättest. Angenommen, Deine Kategorietabelle hätte folgende Einträge:

Kat-ID | Kat-Bezeichnung

42   | Sinn des Lebens
  666  | Number of the Beast

Ok, soweit klar. Ich habe erst jetzt verstanden, dass ihr mit "Kat" wohl Kategorie also ein Schlagwort meintet. Dann wäre diese Tabelle hier sozusagen eine Liste der Schlagworte.

Jetzt möchtest Du aus der Tabelle "Bilder" diese zwei Kategorien dem Bild mit der Nummer 3 zuordnen. Dann sähe Deine 2. Tabelle so aus:

Bild-ID | Kat-ID

3     | 42
  3     | 666

Stopp mal, welche Tabelle ist das jetzt? Wir haben ja nun Tabelle1 (da sind alle Bilder gespeichert, inkl. Auflösung) und Tabelle2 (da sind alle Schlagwörter gespeichert). Und diese Tabelle ist dann eine dritte Tabelle, in der bei jedem Datensatz eine Bild ID und eine Schlagwort ID stehen?

Die hat für sich betrachtet erstmal keine Aussage, denn die bekommt sie erst durch Verknüpfung von Bild-ID mit Bild-ID aus der Tabelle "Bilder" und von Kat-ID mit Kat-ID aus der Tabelle "Kategorien".

Dann mache ich also einen JOIN (Danke Vincent für die Artikel) und habe sozusagen eine virtuelle Tabelle, in der nun der Bildname, die Bild ID und die Schlagwörter stehen.

Und könntest du mir ein kleines INSERT Beispiel machen?

Das bekommst Du selber hin:
http://dev.mysql.com/doc/refman/5.1/de/insert.html

Nee, mir ist schon klar wie man einen normalen INSERT macht.
Aber in diesem Fall ist das ja etwas anders.
Angenommen ein User ordnet einem Bild 5 Schlagwörter zu.
Dann ergänze ich die dritte Tabelle (Bild_ID, Schlagwort_ID) jeweils um 5 Einträge.
Wenn ich dann anzeigen will, welche Schlagworte das Bild hat, mache ich einen JOIN, sodass alle Werte der Tabelle Bilder angezeigt werden, die die gleiche ID wie die Bild_ID in Tabelle3 haben und einen weiteren JOIN, sodass alle Datensätze aus Tabelle2 (die Tabelle wo die Schlagworte gespeichert sind) angezeigt werden, die die gleiche Schlagwort_ID wie die ID in Tabelle3 haben oder?

Dann bekomme ich soetwas:

virtuelle Tabelle (durch JOIN)
-----------------

Tabelle1.bild_id, Tabelle1.bild_name, Tabelle1.bild_auflösung, Tabelle2.schlagwort1
Tabelle1.bild_id, Tabelle1.bild_name, Tabelle1.bild_auflösung, Tabelle2.schlagwort2
Tabelle1.bild_id, Tabelle1.bild_name, Tabelle1.bild_auflösung, Tabelle2.schlagwort3

Und nun gehe ich diese Datensätze in PHP durch und schnappe mir immer das entsprechende Schlagwort. Bzw. werde ich dann vorher nur die Schlagworte abfragen, nicht die anderen Daten.

Aber jetzt habe ich ein Problem:
Wenn ein User einem Bild ein neues Schlagwort zuordnen will, muss ich erstmal gucken, welche Schlagworte das Bild hat und überprüfen, ob das Schlagwort nicht schon dabei ist. Angenommen ich habe 10.000 Bilder von denen jedes 10 Schlagwörter hat, dann dauert das ja (durch die JOINS) extrem lange. Ist das überhaupt noch akzeptabel?

Um die Anzahl der Schalgworte pro Bild ggf. zu begrenzen, werden zusätzliche Mechanismen benötigt.
Darauf gehe ich gleich ein, wenn ich das verstanden habe. Man kann doch einfach abfragen, wieviele Schlagworte einem Bild zugeordnet sind oder nicht?

Ja, kann man.

So wie es jetzt ist, ist das ganze ja einfach, ich zähle wie oben die Schlagwörter und kann dann ja entscheiden.

So, danke dass du mir hilfst, ich glaube es ist nicht einfach mit mir oder? :-)