Tabelle mit Mehrfacheinträgen

Hallo,

ich stehe vor folgendem Problem und finde keine passende Lösung:

Ich möchte eine Cd-Liste als Tabelle in MYSQL anlegen, etwa in folgende Spalten unterteilt:

  1. id
  2. band
  3. Cd-Titel
  4. Genre
  5. Label
    usw

Jetzt gibt es ja Cds, die mehrere Bands enthalten (sogenannte Split-Cds), meistens sind es 2,3 oder 4 Bands

Es kann in Spalte 2. also 2 oder mehr Einträge geben. Da ich zusätzlich eine 2. Tabelle mit Bandinformationen, Weblink usw habe, möchte ich, daß in der Cd-Tabelle jeweils ein oder mehrere ids aus der 2. Tabelle gespeichert werden können.

Wie setzt man sowas um? Bei einer Ausgabe der Cd-Tabelle sollen natürlich immer die Bandnamen ausgegeben werden, die ja nur als Ids gespeichert sind.

Gruß, Andreas

Hi,

angenommen Tabelle 1 heisst : CD_TITEL
und hat die Spalten
ID
NAME


Wobei ID der eindeutige Schlüssel ist.

Dann gibts eine Tabelle 2 die nennt sich INTERPRETEN mit den Spalten
ID
NAME

So, um Tabelle 1 innerhalb einer sog. 1:N-Beziehung aufzulösen macht mann eine dritte Tabelle, die wir z.B. INTERPRETEN_CD_ZUORDNUNGEN nennen. Spalten:

CD_ID
INTERPRET_ID

Somit kannst Du dann die Tabelle 1 und 2 über 3 dann Verknüpfen.

Gruß
Andreas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Andreas,

danke daß du dich reingedacht hast. Das klingt sehr gut und würde auch funktionieren.

Allerdings ist es nach meinem Verständnis eine m:n Beziehung (da zu einer Interpret_ID ja mehrere CD_IDs gehören können und umgekehrt zu einer CD_ID auch mehrere Interpret_IDs ( bei Split-Cds, auf denen mehrere Interpreten vorhanden sind)

Wenn ich die 3. Tabelle aber als m:n Beziehung anlege, wüßte ich nicht, wie ich z.B. den gesamten Cd-Bestand ausgeben könnte.

Nehmen wir an, ich würde folgendes probieren:

„SELECT * FROM Cd-Titel, Interpreten, Interpreten_Cd_Zuordnungen WHERE Cd-Titel.id = Cd_id AND Interpreten.id = Interpret_id ORDER BY Interpreten.Name, Cd_titel.Name“

Dann würde eine Cd, die mehrere Interpreten beinhaltet auch dementsprechent oft in der Cd-Liste erscheinen, so als ob jeder der Interpreten dieses Album alleine gemacht hätte:smile:
Ich möchte aber, daß auch Cds, die mehrere Interpreten beinhalten nur einmal in der Liste erscheinen, und dort alle Interpreten aufgelistet werden.

Und dabei möchte ich möglichst nicht mehrere Interpreten in ein und dasselbe Feld der Datenbank schreiben, da dort wie gesagt zu jedem einzelnen Interpreten noch weitere Informationen gespeichert sind.

Weiß da jemand weiter?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Nachtrag: in dem SQL Befehl fehlt natürlich der JOIN…

Nehmen wir an, ich würde folgendes probieren:

„SELECT * FROM Cd-Titel, Interpreten,
Interpreten_Cd_Zuordnungen WHERE Cd-Titel.id = Cd_id AND
Interpreten.id = Interpret_id ORDER BY Interpreten.Name,
Cd_titel.Name“

Hi!

Ohne das ich jetzt alles gelesen hätte, hab ich vor kurzem (also vor 7-8 Jahren :wink: sowas mal gemacht (und über Jahre hinweg sogar aktuell gehalten, aber in Zeiten von MP3s hab ich dann so um 2002 aufgegeben)

Hier die Kurzform:

Tabelle INTERPRET(INT_ID,INT_NAME)

Tabelle GENRE(GEN_ID,GEN_NAME)

Tabelle ART (!!! damals gab’s noch richtigs Vinyl fast überall zu kaufen)(ART_ID,ART_NAME)

Tabelle MEDIUM(MED_ID,ART_ID,MED_TITEL)

Tabelle MED_INT(MI_ID,MED_ID,INT_ID,GEN_ID,MI_TITEL)

Da gabs dann die Datensätze in MEDIUM:

MED\_ID ART\_ID INT\_ID MED\_TITEL
1 1 'Partizanen'
2 2 1 'London Calling'

und in MED_INT:

MI\_ID MED\_ID INT\_ID GEN\_ID MI\_TITEL
1 1 2 1 'Hey Rote Zora'
6 2 1 'Brand New Cadillac'

und bei einem

select int\_name,gen\_name,art\_name,med\_titel,mi\_titel
from interpret int,genre gen,art art,medium med,med\_int mi
where int.int\_id = nvl(mi.int\_id,med.int\_id)
and gen.gen\_id = mi.gen\_id
and art.art\_id = med.art\_id
and med.id = mi.med\_id

INT\_NAME GEN\_NA ART\_ MED\_TITEL MIT\_TITEL
----------- ------ ---- ---------------- --------------------
HbW Punk CD Partizanen Hey Rote Zora
The Clash Punk LP London Calling Brand New Cadillac
The Clash Punk LP London Calling Spanish Bombs
Toxoplasma Punk CD Partizanen Schwarz Rot Braun

Das Ganze war natürlich mit Erscheinungsdatum, Stichwortsuche, usw. noch ausgeschmückt; aufgegeben hab ich erst, als ich auch noch Hörproben und Texte reinnahm (nach 2 LP’s gab ich auf, der Aufwand war’s mir nimmer Wert)

Grüße,
Tomh

Hi,

danke für die Antwort. Das ist ja ziemlich ähnlich wie bei mir.
Wobei ich nicht verstehe, wofür genau die Tabelle MED_INT gut ist.

außerdem verstehe ich die WHERE Klausel nicht
where int.int_id = nvl(mi.int_id,med.int_id)
Ich meine die beiden Spaltennamen in Klammern mit dem nv1 davor.

Ich gib dir nochmal ganz kurz meine Problem mit meiner eigenen Datenbank an (damit du nicht den ganzen Text lesen mußt)

Mein einziges Problem ist: Wie speichert man Split-Cds (d.h. Cds, die von 2, 3, oder 4 Interpreten sind, nicht Sampler) in der Datenbank und wie kann man sich die Daten hinterher ausgeben lassen? Und das, ohne mehrere Einträge in einem Feld zu haben.

Gruß, Andreas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

außerdem verstehe ich die WHERE Klausel nicht
where int.int_id = nvl(mi.int_id,med.int_id)
Ich meine die beiden Spaltennamen in Klammern mit dem nv1
davor.

nvl (Oracle-„Slang“): falls mi.int_id NULL ist, dann nimm med.int_id
andersrum:

(mi.int\_id=int.int\_id and med.int\_id is null) or
med.int\_id=int.int\_id and mi.int\_id is null)

(wobei das nun die „strenge“ Bedingung ist - das „and x.int_id is null“ könnte man ev. auch weglassen)

Wobei ich nicht verstehe, wofür genau die Tabelle MED_INT gut
ist.

Mein einziges Problem ist: Wie speichert man Split-Cds (d.h.
Cds, die von 2, 3, oder 4 Interpreten sind, nicht Sampler) in
der Datenbank und wie kann man sich die Daten hinterher
ausgeben lassen? Und das, ohne mehrere Einträge in einem Feld
zu haben.

Und dazu ist die Tabelle MED_INT da: Der Interpret bzw. die Verknüpfung steht entweder in der Tabelle MEDIUM selbst (falls wirklich nur ein Interpret drauf ist) bzw. in der Tabelle MED_INT, in der dann jeder Track drinnen ist.

Du brauchst ganz einfach eine Tabelle zwischen der CD und dem Interpreten.

In Deinem Fall steht dann die ID der 2, 3 oder 4 Interpreten dann drinnen.

Das Ganze ist schön in der 3.Normalform gebracht (deswegen auch die ganzen ID’s)

Grüße,
Tomh