PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   MySQL - Filmdatenbank - Filmtitel/Darsteller Abfrage (http://www.selfphp.de/forum/showthread.php?t=25062)

loddoking 17.09.2013 17:25:25

MySQL - Filmdatenbank - Filmtitel/Darsteller Abfrage
 
Ja, hallo erstmal...
Da ich mich neuerdings seit Jahren wieder mit mysql beschäftige sind meine Kenntnisse wtwas eingerostet. Also bitte etwas nachsicht üben.

Ich bastle zur zeit an einer etwas umfangreicheren Filmdatenbank.
Ich habe, vereinfacht dargestellt hier erstmal zwei Tabellen.

Darsteller
Darsteller_ID (Primärschlüssel), Name, Gebutsdatum usw...

Filme
Film_ID (Primärschlüssel), Filmtitel, Produktionsjahr usw..., Darsteller_ID 1, Darsteller_ID 2 usw...bis Darsteller_ID 70


Um redundante daten zu vermeiden habe ich nur in der Filmtabelle alle Dasteller_IDs aufgeführt die in dem Film vertreten sind.
Ich weiss nicht ob das die beste Möglichkeit für das Problem Film/Darsteller war. Aber andersherum wäre noch mehr Redundanz aufgetreten.

Ich habe nun die Dasteller_ID aus der Darstellertabelle als Primärschlüssel mit sämtlichen Darsteller_IDs in der Filmtabelle als Fremdschlüssel verknüpft.
Das Problem ist nun, dass ich bei der Abfrage nach Filmtitel und Darsteller ja nun kaum alle 70 Darsteller_ID Spalten in der Filmtabelle einzeln berücksichtigen kann.
Aber damit das gewünschte Ergebniss erfolgt müsste doch genau dies geschehen oder?

Per phpMyAdmin habe ich nun die einfache Abfrage mal zusammengeklickt die allerdings nur immer die erste Darsteller_ID Spalte in der Filmtabelle berücksichtigt.
Da aber nun der selbe Dasteller manchmal auch erst in der zweiten, dritten usw. Spalte auftritt bekomme ich immer nur ein unvollständiges Ergebniss!


SELECT `darsteller`.`Darstellername` , `filme`.`Filmtitel`
FROM `filme`
LEFT JOIN `filmdatenbank`.`darsteller` ON `filme`.`Darstller_ID` = `Darsteller`.`Darsteller_Id`
ORDER BY `darsteller`.`Darstellername` ASC
LIMIT 60 , 30


Gibt es da einen eleganteren Weg das Problem anzugehen? Oder habe ich da einen grundsätzlichen Fehler in der Datenbankstruktur drinn nach dem das gewünschte Ergebniss gar nicht erfolgen kann?

Die Abfragen sollen jeweils entweder alle Filmtitel zu einem Darsteller oder alle Darsteller zu einem Filmtitel liefern.

Ckaos 18.09.2013 00:29:25

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
Hi

Zitat:

kaum alle 70 Darsteller_ID Spalten
Genau deswegen 3te Tabelle, nimm die 70 da raus...

Filme_Darsteller
Film_ID,Darsteller_ID

Bitte schaue dir dazu vielleicht auch (zum 1000sten mal erwähnt hier im Forum)
http://de.wikipedia.org/wiki/Normali...28Datenbank%29
an

MfG

CKaos

loddoking 18.09.2013 13:53:14

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
@Ckaos: Danke erstmal für deine Antwort.
Das mit der Normalisierung war eigentlich ein Thema dass ich erst zu einem späteren Zeitpunkt in Angriff nehmen wollte. Aus dem Informatik Unterricht vor vielen JAhren wurde uns das damals ja so verdeutlicht das man erstmal die Datenbankstruktur und menge der Tabellen im anfangsstadium so klein wie möglich halten sollte und die Normalisierung und optimierung erst später drann kommt.

Ich habe das jetzt mal wie vorgeschlagen gemacht und die Darsteller_IDs aus der Filmtabelle getrennt und mit der Film_ID zusammen eine zwischentabelle daraus gemacht.
Die Verknüpfung sieht jetzt folgendermaßen aus:

Filme
Film_ID (Primärschlüssel), Filmtitel, Produktionsjahr usw...

Filme_Darsteller
Film_ID (Primärschlüssel), Darsteller_ID 1, Darsteller_ID 2 usw...(Fremdschlüssel)

Darsteller
Darsteller_ID (Primärschlüssel), Name, Gebutsdatum usw...


Bei der einfachen Abfrage kommt natürlich nur murks raus...
Es werden sämtliche Darsteller mit sämtlichen Filmen angezeigt die in keinem bezug zueinander stehen.

Code:

SELECT `darsteller`.`Darstellername` , `filme`.`Filmtitel`
FROM `filme` , `darsteller`
LIMIT 0 , 30

Arbeite ich hinggegen mit Join wie in meinem ersten versuch bekomme ich nur die Darsteller der ersten Darstellerspalte in der zwischentabelle.

Mir ist nicht ganz klar wie ich diese simple Abfage gestalten soll um das gewünschte Ergebniss zu bekommen.
Die zweischetabellle Filme_Darsteller gibt dem ganzen zwar mehr Struktur aber macht die Abfragen irgendwie noch kopmlizierter...:(

sysop 18.09.2013 15:03:20

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
Das hast du fasch verstanden.
Die dritte Tabelle besteht aus genau 2 Feldern (eventuell ein Zusammengesetzter Primärschlüssel).

1 Filme_ID
2.Darsteller_ID

Für jeden Film fügst du nun entsprechende Datensätze mit den darstellern ein.

Code:

Bsp:
Filme:
ID  TITEL
1    Forrest Gump
2    Noch drei Männer und ein Baby

Darsteller:
ID  NAME
1  Tom Hanks
2  Gary Sinise
3  Tom Sellek
4  Ted Danson

Besetzung:
Film_ID  Darsteller_ID
1            1
1            2
2            3
2            4


loddoking 18.09.2013 15:49:52

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
@sysop: OK, dann hab ich es wohl falsch verstanden.
Aber leider lässt sich diese Version dann nicht realisieren.

Die Datensätze die ich importieren möchte liegen nunmal in eben dieser Form in den csv Files vor.
Also, die einzelnen Darsteller zum Film in Spalten. Ich habe keine vorstellung wie man das nun umdrehen könnte das daraus zeilen werden.
Abgesehn davon führt das doch zu einer ungeheuren menge an zusätzlichen Datensätzen in der Tabelle Besetzung.

Nur mal als Anhatspunkt, ich rede hier von etwa 20 000 Datensätzen für Darsteller und etwa 10 000 für Filme. Hinzu kommen später nochmal ein paar Tabellen für Serien, Kurzfilme usw... die zusammengenommen nochmal um die 20 000 Datensätze beinhalten.

Wenn man zb von 100 Filmen mit jeweils 10 Darstellern ausginge sind das schon 1000 Datensätze in der Besetzungstabelle.
Führt das nicht zu noch mehr Redundanz da dann die FilmID unnötigerweise vielfach vorkommt?

Ich weiss noch das wir das damals im Informatikunterricht angeschnitten hatten. Dass man ein Primärschlüssel mit mehrfachen Fremdschlüsseln in der Zieltabelle verknüpfen kann. Sowas ähnliches hatten wir damals auch gemacht. Ich weiss nur nichtmehr wie das genau ging.

Im grunde geht es ja darum dass automatisch in der Filmtabelle/Besetzungstabelle jede einzelnde der 70 Darsteller_ID Spalten mit der Darsteller_ID Spalte in der Darsteller Tabelle verglichen werden, wo dann der Name und weitere Infos drin stehen.

Um die Performance brauch ich mir zu diesem Zeitpunkt dann noch keine großen Gedanken zu machen. Da aller Voraussicht nach das ganze wohl eh nur ein Privatprojekt bleiben wird, sind auch keine hohen Zugriffzahlen usw. zu erwarten.

meikel (†) 18.09.2013 17:24:17

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
Zitat:

Zitat von loddoking (Beitrag 145496)
@sysop: OK, dann hab ich es wohl falsch verstanden.

Da haste den Sysop falsch verstanden. Der hat Dir gezeigt, wie es ordentlich gemacht wird.
Zitat:

Aber leider lässt sich diese Version dann nicht realisieren.
Die Datensätze die ich importieren möchte liegen nunmal in eben dieser Form in den csv Files vor.
Dann hast Du eben das Pech, daß Du aus dem Schrott Dir die für eine ordentliche Datenbank erforderlichen Daten rausklaubst.
Zitat:

Führt das nicht zu noch mehr Redundanz da dann die FilmID unnötigerweise vielfach vorkommt?
Nein, wenn die film_id + darsteller_id ZUSAMMEN einen primary_key bilden.

Du liest die Filme teilenweise ein. Filmtitel, Erscheinungsjahr, Inhalt (KA, was in der CSV Liste so alles rumschwirrt) erledigst Du ein INSERT, fragst insert_id ab. Dann nimmsste Dir die Darstellerspalten vor: bei jedem Darsteller guckste erst nach, ob der schon in der Darstellertabelle ist. Falls ja, haste die Darsteller id, falls nicht: INSERT + insert_id.
Mit den beiden ID machste in die Besetzungstabelle einen INSERT.

Und weil diese Aktion sicher länger als 30sec. dauert, mußte Dir was einfallen lassen, weil sonst PHP nach 30 sec. abbricht.

loddoking 18.09.2013 18:20:18

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
Zitat:

Zitat von meikel (Beitrag 145498)
Da haste den Sysop falsch verstanden. Der hat Dir gezeigt, wie es ordentlich gemacht wird.

Dann hast Du eben das Pech, daß Du aus dem Schrott Dir die für eine ordentliche Datenbank erforderlichen Daten rausklaubst.

Nein, wenn die film_id + darsteller_id ZUSAMMEN einen primary_key bilden.

Du liest die Filme teilenweise ein. Filmtitel, Erscheinungsjahr, Inhalt (KA, was in der CSV Liste so alles rumschwirrt) erledigst Du ein INSERT, fragst insert_id ab. Dann nimmsste Dir die Darstellerspalten vor: bei jedem Darsteller guckste erst nach, ob der schon in der Darstellertabelle ist. Falls ja, haste die Darsteller id, falls nicht: INSERT + insert_id.
Mit den beiden ID machste in die Besetzungstabelle einen INSERT.

Und weil diese Aktion sicher länger als 30sec. dauert, mußte Dir was einfallen lassen, weil sonst PHP nach 30 sec. abbricht.

Ich sagte ja dass es ein paar Jährchen her is.;)
Da müsst ich mich erstmal n paar Tage schlau machen um diese Variante überhaupt anzugehen und über das phpMyAdmin brauch ich es erst gar nich zu versuchen.

Würde es einen unterschied machen wenn ich das über ein Tool wie HeidiSQL mache und dord das Query ausführe?

Mir wär es am liebsten wenn die Daten so bleiben könnten wie sie sind ohne umstrukturierung, auch wenn dadurch die anzahl der möglichen darsteller von vorn herein begrenzt ist.

Eventuell läst sich die vorgeschlagene Besetzungstabelle mit nur zwei spalten als zusammengesetztes Primärschlüssel ja auch mit externen mitteln erzeugen. CSV Files sind ja sehr flexibel in der hinsicht.

Mir ist nur nicht ganz klar wie das am ende mit der eingabe neuer Datensätze funktionieren soll wenn man zb einen neuen Film eingibt mit all seinen daten in der Filmtabelle also in verschiedenen Spalten aber dann die einzelnen Darsteller in einer weiteren Tabelle aber Zeilenweise jeweils als neuer Datensatz. Das wären dann doch zwei unterschidliche paar schuhe oder?
Wenn das dann auch noch einhergeht mit der eingabe neuer Darsteller kommt man doch in teufels küche. Da ja dann automatisch ein neuer Datensatz (zusammengesetzter Primärschlüssel) in der Besetzungstabelle erzeugt werden müsste der aus jeweils ebenfalls automatisch erzeugten IDs aud der Darsteller- und Filmtabelle besteht!?

Das weitere Problem ist dass da auch noch mindestens 5 weitere Tabellen für Serien, Kurzfilme, Musikvideos usw dazukommen. Die sollen ebenfalls mit der Darstellertabelle verknüpft werden. So dass ich am ende über ein Frontend bequem einen Darstellernamen eingebe und ich sämtliche Filme, Serien usw angezeigt bekomme. Umgekehrt selbstvertändlich ebenso bei der eingabe eines Filmes oder Serie usw. alle Darsteller.

Aber ihr habt ja recht. Wenn eine Kategorie in einer Tabelle mehrfach bis unbegrenzt vorkommt muss sie eigentlich zeilenweise als selbstständiger Datensatz eingegeben werden.

Ich versteh aber nicht wiedo es dann prinzipiell möglich ist ein Primärschlüssel mit zich Fremdschlüsseln in einer Zieltabelle zu verknüpfen? Dann müsste doch eine Abfrage über diese Verknüpfung möglich sein oder?

Aber danke schonmal für die Tipps. Auch wenn ich nun noch konfuser bin als vorher :)

meikel (†) 18.09.2013 18:49:07

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
Also noch mal das Prinzip:
Tabelle mit allen Filmtiteln: film_id, <was Du sonst noch so brauchst>; pk, auto_increment
Tabelle mit allen Schauspielern: darsteller_id,<was Du sonst noch so brauchst>; pk, auto_increment
Tabelle für die Filmbesetzung: film_id, darsteller_id, pk -> film_id+darsteller_id, kein auto_increment

wenn Du wissen willst, wer alles im Film mit der film_id= 47 mitgespiel hat
Code:

SELECT darsteller_id,<was Du sonst noch wissen willst> FROM besetzung WHERE film_id = 47;
und wenn Du wissen willst, in welchen Filmen Schauspieler mit der darsteller_id = 123 mitgespiel hat:
Code:

SELECT film_id,<was Du sonst noch wissen willst> FROM besetzung WHERE darsteller_id = 123;
Den fehlenden Filmtitel oder Darstellername holst Du Dir mit einem Join aus der film oder darsteller Tabelle.

Doubletten in der besetzung Tabelle kann es nicht geben, weil ein Schauspieler nur einmal in der Besetzungsliste auftaucht - selbst dann, wenn er eine Doppelrolle spielt.
Zitat:

CSV Files sind ja sehr flexibel in der hinsicht.
Die Idee, wegen einer Abfrage kilometerlange CSV Files umzugraben, solltest Du vergessen.
Zitat:

... ein Tool wie HeidiSQL...
Kenn ich nicht. Mir reicht der PMA völlig aus.

loddoking 18.09.2013 19:21:29

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
@meikel: das Prinzip der Abfrage bei der Basetzungstabelle ist mir schon klar. Ist ja kein Hexenwerk wenn da ja eh zu jeder möglichen Film/Darsteller kombination ein eigener Datensatz existiert.
Und das ich die Tabellen entsprechend so umbauen kann glaube ich schon.

Was mir aber Bauchschmerzen verursacht ist die spätere Dateneingabe wenn ich es mit rund 7 Tabellen (1 Darsteller + 6 verschiedene Film, Serien usw..) zu tun habe. Dazu kommen ja dann nochmal 6 Besetzungstabellen.
Die befüllung der Darsteller und Film/Serie usw. Tabellen ist ja nich weiter schwer. Wie man aber nun bewerkstelligt dass die zugehörigen Besetzungstabellen automatisch mit den richtigen Werten befüllt werden!?
Es muss ja dann jedesmal ein zweispaltiger Datensatz aus den zwei IDs erstellt werden die per auto_increment in den Ursprungstabellen erzeugt wurden.

So wie ich es ja verstanden habe muss ja bei jedem neuen datensatz in den Darsteller und/oder Film/Serie... Tabellen ja auch ein neuer Datensatz in einer oder mehreren Besetzungstabellen. Es sei denn natürlich der Darsteller/Film enthält keine weiteren in bezug stehenden Daten.

vt1816 18.09.2013 20:16:02

AW: MySQL - Filmdatenbak - Filmtitel/Darsteller Abfrage
 
Zitat:

Zitat von loddoking (Beitrag 145501)
[..]
Was mir aber Bauchschmerzen verursacht ist die spätere Dateneingabe wenn ich es mit rund 7 Tabellen (1 Darsteller + 6 verschiedene Film, Serien usw..) zu tun habe. Dazu kommen ja dann nochmal 6 Besetzungstabellen.

Hier hast Du das Prinzip noch immer nicht verstanden. Mehr als die DREI beschriebenen Tabellen benötigst Du nicht (- bei den Informationen die uns bisher vorliegen). Ob es sich um meinen Film oder eine Serie oder ein Blockbuster und sonstige Kategorie handelt, kannst Du in der in der FILM-Tabelle mit ablegen oder gleich eine 4. Tabelle (Kategorien) aussortieren und alles wieder über Schlüssel (*_ID) miteinander verbinden.


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:00:13 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.