# MySQL: Datensätze miteinander verknüpfen



## freedy (8. Juli 2004)

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


----------



## vop (8. Juli 2004)

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


----------



## freedy (8. Juli 2004)

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


----------



## vop (8. Juli 2004)

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


----------



## Gorcky (8. Juli 2004)

@ 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.


----------



## freedy (8. Juli 2004)

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


----------



## Gorcky (8. Juli 2004)

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...


----------



## freedy (8. Juli 2004)

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


----------



## Gorcky (8. Juli 2004)

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...


----------



## fluessig (8. Juli 2004)

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.


----------



## Gorcky (9. Juli 2004)

> _Original geschrieben von fluessig _
> *Wenn die Abfrage mit einem SELECT DISTINCT eingeleitet wird, ist es egal ob die Daten doppelt vorkommen.*


  Gute Idee... und keiner wundert sich, warum die Datenbank immer größer wird, und trotzdem nicht mehr Informationen hergibt...


----------



## AndiSQLANdi (10. August 2004)

*2 Primärschlüssel?*

Hallo

Ich bin an einem ähnlichem Problem. Doch wie kann ich in der Relationstabelle den Primärschlüssel auf beide Spalten setzen? Wenn ich es definiere (create table..) kommt der Fehler "Multiple Primary Key".

Wie kann ich das machen?


----------



## Gorcky (10. August 2004)

Du must doch in deinem CREATE-Statement nach deiner Spaltendefinition nur 
	
	
	



```
PRIMARY KEY (Spalte1,Spalte2)
```
schreiben - dann sollte es klappen - oder? ;-]


----------



## AndiSQLANdi (11. August 2004)

Entschuldige die vielleich blöde Frage, aber wie muss ich dann die Spalten definieren, dass dies funktioniert? Bei mir werden nach dem Erweitern des CREATE-Statements durch den Befehl Fehler ausgegeben. Auch mit dem ADD PRIMARY KEY oder MODIFY Befehl funktioniert es nicht. Was könnte ich falsch machen?


----------



## Gorcky (12. August 2004)

So sollte es eigentlich funktionieren:

```
CREATE TABLE Tabelenname
(
Spalte1 Datentyp Zusatz,
Spalte2 Datentyp Zusatz,
Spalte3 Datentyp Zusatz,
PRIMARY KEY (Spalte1, Spalte2)
)
IN Dataspacename[.Tablespacename]
```
eckige Klammern = optional

Soweit ich weiß, gibt es keine Einschränkung, dass Spalten bestimmte Datentypen/Zusätze (nicht) aufweisen müssen, um als PK gültig zu sein.

Wenn du den PK nachträglich verändern willst, solltest du natürlich darauf achten, dass du nicht einen zweiten PK hinzufügen willst. 
Sonst sagt die DB verständlicherweise: 
Es kann nur einen ersten geben...


----------



## AndiSQLANdi (12. August 2004)

Super! Danke vielmals! So klappt es!


----------

