[MySQL (&PHP)] Verknüpfungen/Relationen erstellen

HeinerK

Erfahrenes Mitglied
Hi,

ich habe eine Frage zu MySQL. Mal sehen ob ich es schaffe mein Problem zu verbalisieren.

Ich bin zurzeit damit beschäftigt für eine eigene Seite eine Art CMS zu schreiben. Wichtig sind mir vor allem gewisse Verbindungen zwischen verschiedenen Inhalten. Am besten versuche ich das ganze an einem Beispiel zu erläutern.

Bsp.: Ich habe eine Tabelle mit allen Artikeln und eine mit allen Fotos. Nun möchte ich jedem Artikel beliebig viele (n) Fotos zuordnen können. Wenn ein Foto einem Artikel zugeordnet wird, soll dies auch umgekehrt der Fall sein. Ich bin sozusagen auf der Suche nach einer Verknüpfung der beiden. Meine erste Idee war es, eine Tabelle mit Relationen zu erstellen:

Tabellenname: relationen
Spalten: [ ursprung_typ | usprung_id | ziel_typ | ziel_id ]

Per Script würde ich ursprung und ziel gleich behandeln. Das heißt ein Eintrag mit ursprung A und ziel B hätte exakt das gleiche Ergebnis wie ein Eintrag mit ursprung B und ziel A.

Zunächst hat mir diese Lösung alle Probleme gelöst. Ich kann pro Artikel/Foto/usw beliebig viele Relationen hinzufügen.

Jedoch ist nach einiger Überlegung die Zuordnung von Relation (Tupel in Tabelle relationen ist gemeint) zu Usprung und Ziel nicht eindeutig, auf Grund des beliebig wählbaren Strings. Die wirkliche Verbindung zwischen ursprung_typ = artikel und der Tabelle artikel würde eine sehr lockere sein (mein Script). Sobald ein neuer Inhaltstyp in meinem System dazukommen würde, müsste ich einiges neu schreiben.

Nun stellt sich für mich die Frage, ob MySQL nicht von Haus aus eine vieeeeel elegantere Variante zur Verknüpfung von einzelnen Datensätzen in verschiedenen Tabellen anbietet. Leider habe ich diesen heiligen Gral noch nicht gefunden :), da ich mich mit mysql einfach nicht genug auskenne.

Vielen Dank schon einmal im Voraus,
Steffen
 
Zuletzt bearbeitet:
Hi,

der Beitrag sollte eigentlich unter diesem User erscheinen. Ein Freund von mir (heinerK) war leider noch auf meinem Notebook eingeloggt. Deshalb das "mfg Steffen" :)

Grüße,
Steffen
 
Ich glaube zu ahnen was du meinst.
Kann es sein das du die 3 Normalformen einer Datenbank suchst ?
Dein Beispiel erfordert eine 1:n Verbindung
1 = eindeutiger Artikel
n = Bilder

Somit ist klar du brauchst mind 2 Tabellen um eine solche Beziehung herzustellen.
Code:
table artikel
aid | artikel | beschr | datum | ... |

table bilder
id | aid | pfad | datum ... |

Die Beziehung ist nun zwischen der aid herzustellen.
 
Nein, genau das nicht. :) Das ist ja die übliche 1:n Beziehung. Ich suche aber viel mehr eine Realisierung einer n:m Beziehung um "in deiner Sprache" zu bleiben.

Jedes Bild soll n Sachen zugeordnet werden können, Beispielsweise Artikel 1(id=1), Artikel 5(id=5) und beliebigen anderen Inhaltsobjekten.

Grüße,
Steffen

EDIT: Das jedem Artikel aber auch m Bilder zugeordnet werden müssen erklärt sich meiner Meinung nach von selbst. Zusätzlich aber auch k verwandte Artikel.
 
Zuletzt bearbeitet:
Hi,
also ich glaube, dass bei einer m:n-Beziehung immer eine 3. Tabelle entstehen muss in der die beiden Schlüssel der anderen Tabelle gespeichert werden.
Bsp.
Tabelle1 (Fotos)
P_fotoid | URL | Größe...

Tabelle2 (Artikel)
P_artid |name | ....

Tabelle3 (Fotos_Artikel)
F_P_fotoid | F_P_artid

Damit kann 1 Artikel n Fotos haben, 1 Foto kann aber auch zu n-Artikeln gehören.

€: Der Daumen im Titel sollte eigentlich nicht sein. War nur ausversehen.
 
Zuletzt bearbeitet:
Damit müsste ich dann aber für jeden weiteren Inhaltstyp der mit Fotos oder Artikeln verknüpft werden soll eine neue Verknüpfungstabelle erstellen, oder?

Grüße,
Steffen
 
Nein, du trägst zb zu einem neuem Foto einen alten Artikel ein. Die id der Fotos bzw. der Artikel würde ich als auto_increment machen. Sagen wir du hast in den Artikel 50 und in den Fotos 20 Einträge und willst zu dem Foto mit der ID 14 den Artikel mit der ID 45 hinzufügen.
Dann machst du:
Code:
INSERT INTO Fotos_Artikel(F_P_fotoid, F_P_artid) VALUES (14,45)
Auslesen tust du dann mit:
Code:
SELECT * FROM Artikel, Fotos, Fotos_Artikel WHERE Fotos.P_fotoid=Fotos_Artikel.F_P_fotoid AND Artikel.P_artid=Fotos_Artikel.F_P_artid

€: Oder habe ich dich jetzt falsch verstanden? Wenn du eine dritte Tabell mit einbinden willst mußt du die Tabelle Fotos_Artikel nur um den Schlüssel der neuen Tabelle erweitern. Die 3.Normalform sagt auch aus das die Tupel einer Tabelle nur von dem Primärschlüssel abhängig sein dürfen und wenn du die Inhalte vermischst ist das nicht der Fall.
 
Zuletzt bearbeitet:
Das heißt am Beispiel:

Ich hab die Tabelle fotos, artikel und artikel_fotos. Wenn ich jetzt den Typ Beispieltyp hinzufüge, erstelle ich die Tabelle beispieltyp und ergänze die tabelle artikel_fotos um eine weitere spalte:

artikel_fotos:
id | artikel_id | foto_id | beispieltyp_id ?

Natürlich müsste man dann über einen anderen Namen der Tabelle nachdenken. :)

Grüße,
Steffen
 
Zurück