MySQL: Datensätze miteinander verknüpfen

freedy

Grünschnabel
Hallo!

Wenn ich den Sinn einer Datenbank richtig verstanden habe, sollen ja unter anderem keine Redundanzen auftreten. Dadurch bekomme ich aber ein kleines Problem:

Tab1: enthält Daten zu verschiedenen Musiknoten
Tab2: enthält Daten zu den verschiedenen Ausgaben(Verlag, Herausgeber usw.)

In Tab1 wird jedes Stück genau einmal erfasst. Tab2 erhält also einen Fremdindex auf einen Datensatz in Tab1. Soweit ist das noch kein Problem.

Jetzt gibt es aber auch Sammelbände, in denen eine Ausgabe mehrere verschiedene Stücke (Datensätze aus Tab1) enthält. Und wenn ich jetzt einen Datensatz aus Tab1 wähle, möchte ich gerne angezeigt bekommen, wo und wie oft das Stück verlegt wurde. Andersherum natürlich auch: Schaue ich mir einen Datensatz aus Tab2 an, möchte ich auch die Daten aus Tab1 sehen können.

Wie kann so etwas realisiert werden? Da ich in DB-Techniken blutiger Anfänger bin, habe ich nämlich nicht die leiseste Ahnung. :(

Gruß
freedy
 
Zitat: Da ich in DB-Techniken blutiger Anfänger bin, habe ich nämlich nicht die leiseste Ahnung.

Dann solltest Du erstmal studieren.....:)

Vorab ein Tipp:

Es gibt Relationstabellen. Da ich das Musikproblem nicht 100% verstanden habe ein Beispiel, was alle nachvollziehen können:
Schueler, Klassen

In der Tabelle Schueler sind die Informationen zu den Schulern, Name etc.
In der Tabelle Klassen sind die Informationen zu einzelnen Klassen, Klassenlehrer, Klassenraum etc.
In der Tabelle SchuelerDerKlasse sind dann alle Schueler einer Klasse eingetragen,
mehr nicht.
Schueler KlasseNr
1 1
2 1
3 2
4 2

Das liest sich dann so: Schueler 1 gehört in Klasse 1, Schueler 2 gehört in Klasse 2 etc.

hilft das schon mal weiter...?

vop
 
Naja, so ganz blutiger Anfänger bin ich nicht, nur was SQL angeht.

Mit Relationstabellen geht das Ganze, glaube ich, nicht.

Da mein Beispiel nicht so ganz eindeutig zu sein scheint, probiere ich es nochmal:

T1 T2
--- ---
A.....1
B.....2
C.....3

Ich habe einen Datensatz A aus Tabelle 1. Der muss z.B. mit dem Datensatz 1 und 2 aus Tabelle 2 verknüpft werden. Ein anderer Datensatz aus Tabelle 1 muss dann z.B. auch mit Datensatz 1 aber anstatt 2 mit 3 verknüpft werden.

Das Problem ist also, einen Datensatz mit mehreren anderen zu verknüpfen, weil ich nicht weiß, wie ich diese Information im Datensatz hinterlegen kann. Normalerweise würde ich einen Fremdindex benutzen. Dieser kann ja aber nur auf einen Datensatz verweisen.

freedy
 
Genau. Due brauchts eine Tabelle, in der du eben diese Verknüpfungen einträgst

T3
A 1
A 2
B 1
B 3

Der Trick ist, dass in so einer Relationstabelle ein Eintrag mehrfach stehen darf!
Also T1.A kommt in T3 zwei mal vor einmal für T2.1 und einmal für T2.2

Alles klar?

vop
 
@ freedy:
Du weißt doch hoffentlich dass man einen Primary Key auch über 2 Spalten legen kann?
Genau das musst du nämlich dafür tun.
 
Hallo vob,
Danke für die Hilfe. Auf die dritte Tabelle bin ich inzwischen mit ein bisschen Nachdenken auch gekommen.

@Gorcky
Aber wieso muss ich den Primärschlüssel über 2 Spalten legen?

Gruß
freedy
 
Wie willst du es denn sonst machen ?
Der Primärschlüssel ist doch UNIQUE, das heißt ein Wert kann in dieser Spalte nur einmal vorkommen. Das würde ja nicht gehen.
Daher musst du den Primärschlüssel über beide Spalten legen, so dass die Werte-Kombination UNIQUE ist...

Aber da wärst du mit ein bisschen Nachdenken sicherlich auch drauf gekommen...:rolleyes:
 
hm... naja, wenn sowas geht. Ich habe jetzt einfach mal drei Felder angelegt:

1. eine eigene ID als Primärschlüssel, die dann UNIQUE ist.
2. ID -> Tab 1
3. ID -> Tab 2

Ist das also nicht klug?

Werde deine Variante aber gerne testen.

Gruß
freedy
 
Wozu brauchst du die extra ID? Ist doch Verschwendung.
"Meine" Variante ist die allgemein gebräuchliche.
Wenn Du Deine Variante anwendest, hast du nicht sichergestellt, dass eine bestimmte Kombination nur einmal vorkommt - du müsstest also noch ein extra UNIQUE über die Spalten legen...
 
Wenn die Abfrage mit einem SELECT DISTINCT eingeleitet wird, ist es egal ob die Daten doppelt vorkommen.
Ganz klar ist jedoch der Version bei der man beide Felder als Primärschlüssel verwendet die bessere.
 

Neue Beiträge

Zurück