Empfehlungen: Erweiterte Suche

Beziehungsprobleme in Musik-Datenbank (verzwickt)

Fragen zur Konzeptionierung und womit man am besten anfäng? Hier rein...

Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon enigmartin » Mo 23. Mai 2011, 18:50

Hallo Leute,

nach einiger Zeit der Abwesenheit melde ich mich mal wieder mit einem Problem. Ich bin immer noch sehr eifrig und regelmäßig dabei meine Akkord-Datenbank zu vervollständigen. Jetzt stoße ich auf ein Beziehungsproblem. ( Nein, keine Frau :lol: )

Ich habe drei Tabellen die mit einander über eine weitere Tabellen verbunden sind: artists, albums, lyrics, albums_artists, albums_lyrics und artists_lyrics. Nun möchte ich in der View (albums/view.ctp) anzeigen welche Lieder dem Album zugeordnet sind. Das klappt zwar, ist aber noch nicht zufriedenstellend. Zum einen gebe ich die Möglichkeit die Titelnummer eines Liedes auf dem Album anzugeben, danach sollten die Lieder des Albums auch sortiert werden, was nicht klappt. Zum anderen sollen auch die jeweiligen Künstler den Liedern zugeordnet werden. Da es Alben, Sammelalben und auch Splits gibt kann es mehrere Künstler auf einem Album geben und da auch Mehrere Künstler an einem Lied mitwirken können oder ein anderer Künstler hat das Lied eines anderen nachgespielt, müssten auch mehrere Künstler einem Lied zugeordnet werden können.
Ich habe aber überlegt jedem Lied einen Hauptkünstler zuzuordnen, der der das Lied also geschrieben bzw. veröffentlicht hat, dessen ID wird auch in dem Lied mitgespeichert (bspw. main_artist / autor). Ich stehe dann aber immer noch vor dem Problem das nach meinen Vorstellungen in den Views ausgeben zu können.

Es war jetzt schon ne extreme Arbeit diesen Text zu schreiben um das ganze auch richtig und verständlich zu erläutern. Ich habe momentan keine Code-Beispiele die ich schreiben könnte. Einmal weil ich gerade nicht am heimischen Rechner bin und zum Zweiten weil ich ehrlich gesagt noch nicht mal Ansätze dafür habe.

Ich appelliere vor allem an die Leute die mit CakePHP schon mal eine Film-Datenbank programmiert haben. Das sollte ebenfalls so kompliziert sein. Ich mache mir natürlich weiterhin Gedanken darüber aber irgendwann setzt es bei mir immer öfter aus.

Ich würde mich freuen wenn es hier son paar Beziehungprofis gäbe, die sich mit Beziehungen in CakePHP auskennen.

Vielen Dank für jede Hilfe.
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon mbrod » Mo 23. Mai 2011, 23:01

Wie schon an anderer Stelle gesagt, ist dies kein CakePHP spezifisches Problem, sondern - so glaube ich nennt man das - der Systemanalyse. Vielleicht ist auch dieser ältere Thread hilfreich.
Meine persönliche Vorgehensweise ist so, dass ich einfach an einer Stelle mal anfange zu backen. Beim speichern und abrufen von Daten merke ich dann recht schnell, ob die Beziehungen stimmen oder nicht. Das ändern von Beziehungen geht nach meiner Erfahrung in CakePHP dann wirklich sehr gut, sodass ich mein Projekt nach und nach aufbauen und vervollständigen kann. Eine Film-Datenbank war aber bisher nicht dabei ;), sodass ich hier nur allgemein etwas sagen kann.

Als ein getrennt zu betrachtendes Problem beschreibst Du die Views, die nicht so funktionieren wie Du möchtest. Das wäre wirklich ein anderes Thema - vielleicht auch mit Beispielcode -, denn im Prinzip sind im View alle Daten entsprechend den Beziehungen vorhanden.
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon enigmartin » Di 24. Mai 2011, 16:17

Danke erstmal für deine Antwort. Meine Beziehungen stimmen so wie sie sollen, denke ich zumindest. Dies ist aber eher ein spezifisches Problem.

Wie es bisher war, wurde in der artists_lyrics die Beziehungen von Artists zu Lied aufgebaut. Also können mehrere Künstler an einem Lied mitgewirkt haben oder mehrere Künstler können dieses Lied gesungen haben. Nun habe ich in der lyrics-Tabelle ein weiteres Feld hinzugefügt (autor) worin der Hauptkünstler gespeichert wird, bzw. seine ID. So kann ich genau sagen wer der Hauptkünster ist und den will ich bei der Anzeige (view) eines Albums für jedes jeweilige Lied anzeigen.

Momentan wird nur die ID angezeigt, logisch, da ich noch keine Beziehung in dem entsprechenden Model angegeben habe. Ich weiß nun aber nicht genau in welchem Model ich das bewerkstelligen muss.

Zum besseren Verständnis habe ich das ganze mal auf einem Test-Server hochgeladen, der sehr langsam ist aber seinen Zweck erfüllt. Einfach mal unter Albums schauen wie die Lieder zugeordnet wurden:

URL: http://akkorde.square7.ch/
Benutzername: Tester
Passwort: tester

PS: Ich suche gerade noch ein geeignetes Album/Sammelalbum heraus um dies einzutragen. Also nicht wundern wenn noch kein Album vorhanden ist. Ich bin just in diesem Augenblick dabei.

Nachtrag: Das Album ist drin. Die Reihenfolge stimmt nun zufällig. Es gibt aber auch die Möglichkeit das die Reihenfolge der Lieder auf dem Album in der Datenbank nicht richtig ist. Da dies keine einfache Musik-Datenbank ist, sondern eine Akkordseite, kann es sein das erst nach und nach die Lieder auf den Alben in die Datenbank eingetragen wird. Wird also eines bspw. das 8. Lied zuerst eingetragen steht es logischerweise an erster Stelle, deswegen muss irgendwie die Reihenfolge auch nach der Title-Nummer sortiert werden, was wie gesagt noch nicht klappt.
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon mbrod » Mi 25. Mai 2011, 08:07

enigmartin hat geschrieben:Momentan wird nur die ID angezeigt, logisch, da ich noch keine Beziehung in dem entsprechenden Model angegeben habe.
Die Beziehung ist schon da, im View musst Du halt in den ersten beiden Spalten statt ['autor']['id'] ['autor']['name'] anzeigen lassen.

enigmartin hat geschrieben:...deswegen muss irgendwie die Reihenfolge auch nach der Title-Nummer sortiert werden...

Im Controller bei der Abfrage die Sortierung mit angeben:
Code: Alles auswählen
$this->Model->find('all', array('order'=>'title_num ASC'))
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon enigmartin » Mi 25. Mai 2011, 08:52

Ganz so einfach geht das leider nicht.

Ich habe in der view ja nur die Daten des Albums und alle dazugehörigen Daten, da ich aber manuel die Artist.id in Lyric.autor speichere besteht da noch keine Beziehung. Ich hab schon versucht im Model eine Beziehung herzustellen aber bisher ohne Erfolg.

Die AlbumsController::view sieht wie folgt aus:
Code: Alles auswählen
function view($slug) {
    if (!$slug) {
        $this->Session->setFlash(__('Invalid album', true));
        $this->redirect(array('action' => 'index'));
    }
    $album = $this->Album->findBySlug($slug);
    $this->set(compact('album'));
    $this->set('title_for_layout', $album['Album']['name']);
}


Im in der view.ctp habe nur die Variable $album und die dazugehörigen Lieder gebe ich ja mit einer foreach aus:
Code: Alles auswählen
<div class="AlbumLieder">
    <table cellpadding="0" cellspacing="0" width="100%">
        <?php foreach( $album['Lyric'] as $lyric ) : ?>
        <tr>
            <td><?php echo $lyric['title_num']; ?></td>
            <td><?php echo $lyric['autor']; ?></td>
            <td><?php echo $html->link($lyric['name'], array('controller' => 'lyrics', 'action' => 'view', $lyric['slug'])); ?></td>
            <td>
                <div>
                    <div class="status" title="<?php echo $lyric['status']; ?>%">
                    <div class="balken" style="width:<?php echo $lyric['status'] ?>%;">&amp;nbsp;</div>
                </div>
            </td>
            <td><?php echo $html->link(__('Edit', true), array('controller' => 'lyrics', 'action' => 'edit', $lyric['id'])); ?></td>
        </tr>
        <?php endforeach; ?>
    </table>
</div>


Die Lieder habe ich dementsprechend in $album['Lyric'] und die Artisten sind dann in $album['Artist']. Was ich versuchen könnte ist über PHP zu überprüfen ob die Artist.id == Lyric.autor ist. Das wollte ich aber vermeiden, da dies das ganze sicher langsamer macht und an sich so auch nicht gewollt ist.

Verstehst du was ich meine. Ich bräuchte von vornherein ein Array was etwa so aussieht:
Code: Alles auswählen
Array
(
    [0] => Array
    (
        [Artist.id] => 123
        [Artist.name] => The Beatles
        [Artist.slug] => The_Beatles
        [Lyric.id] => 321
        [Lyric.name] => Yesterday
        [Lyric.slug] => Yesterday
    )
    [1] => Array
    (
        [Artist.id] => 111
        [Artist.name] => Volbeat
        [Artist.slug] => Volbeat
        [Lyric.id] => 222
        [Lyric.name] => Sad Mans Tongue
        [Lyric.slug] => Sad_Mans_Tongue
    )
)


Dies nur als Beispiel. Also quasi so das Artist und Lyric schon einander zugeordnet sind, dies aber nicht anhand der hasAndBelongsTo-Tabelle artists_lyrics sondern anhand der Artist.id == Lyric.autor, die ich manuel beim einpflegen speichere.

Ich hab jetzt auf dem Testserver mal eine print-Ausgabe der Variablen $album gemacht, zum besseren Verständnis.
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon mbrod » Mi 25. Mai 2011, 14:51

Probier doch mal im AlbumsController
Code: Alles auswählen
$this->Album->recursive = 2;
$album = $this->Album->findBySlug($slug);
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon enigmartin » Mi 25. Mai 2011, 14:55

Ich hab es probiert aber kannst du kurz erklären was genau das bringen soll? Ich kann damit leider nichts anfangen.
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon mbrod » Mi 25. Mai 2011, 16:09

Erklärung:
http://book.cakephp.org/view/1063/recursive
Wenn ich dein Projekt richtig verstehe gibt es Beziehungen Albums<=HABTM=>Lyrics<=HABTM=>Artists.
Die Rekursionsstufe 2 ist die, mit der man an die am "weitesten" entfernt liegenden Daten zurückbekommt. Das sollte in der print-Ausgabe zu erkennen sein.
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon enigmartin » Mi 25. Mai 2011, 16:32

Gut das hab ich verstanden aber das bringt mir nichts.

Es besteht scheinbar noch keine Beziehung von Artist.id zu Lyric.autor. Ich glaube du hast mein Problem nicht ganz verstanden. Ich weiß auch nicht wie ich das noch besser erläutern soll.

Ich habe folgende Möglichkeiten:

1. Ich lege ein Künstler (artists) an und kann es einem oder mehreren Alben und auch Lyrics zuordnen
2. Ich lege ein Album (albums) an und kann es einem oder mehreren Künstlern und auch Lyrics zuordnen
3. Ich lege eine Lied (lyrics) an und kann es einem oder mehreren Künstler und auch Alben zuordnen
4. Wenn ich ein Lied (lyrics) anlege dann möchte ich diesem auch noch einen Hauptkünstler zuordnen

Ich kann über die beziehungen mehrere vom einen dem anderen zuordnen. Lese ich nur für ein Lied den Künstler aus, kann es je nach Reihenfolge der richtige aber auch der falsche sein. Deshalb gebe ich die Möglichkeit den autor zu speichern. Darüber möchte ich nun in der Album-Ansicht (albums/view.ctp) das zugehörige Lied zu dem Album und zu guter letzt den zugehörigen Hauptkünstler hinter dem Lied auslesen. Würde ich für jedes Lied alle Künstler die auf dem Album sind auslesen, wären die irgendwie willkürlich hinter ein Lied geschrieben, was nicht stimmt.

Im Anhang mal mein Datenbank-Design.
Dateianhänge
db-design.png
db-design.png (77.1 KiB) 179-mal betrachtet
Benutzeravatar
enigmartin
 
Beiträge: 40
Registriert: So 27. Mär 2011, 10:42
CakePHP-Version: 1.3.8
OS: Windows 7

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon mbrod » Mi 25. Mai 2011, 21:33

Kleine Abschweifung: Das Bildschirmfoto vom Datenbank-Design, ist das von dem MYSQLWorkbench Programm, welches du in einem anderen Thema erwähnt hattest?

So langsam sehe ich klarer.
recursive=2 hat aber doch schon Möglichkeiten gebracht, denn dort erscheint jetzt zu jedem Lied auch ein Artist array über den man den Namen des Künstlers ausgeben kann.
Es geht aber um den Autor.
Lyrics kann mehrere Künstler haben, die über die artists_lyrics Tabelle zugeordnet werden. Der Autor kommt ja auch aus der Künstlertabelle. Pro Lied nur ein Autor !? Dann kann man statt des Feldes autor auch artist_id nehmen und im Model Lyric belongsTo Artist definieren. (So habe ich das in einem ähnlich gelagerten Fall bei mir gelöst.) Dann reicht auch recursive=1 oder sogar 0. (Ich probiere das meistens aus um nicht zu viele Datenbankabfragen zu haben.)

Einen Gedankenknoten bekomme ich bei diesen Beziehungsdefinitionen schon auch immer: Lied hat einen Autor wird aber als belongsTo definiert. Kind hat einen Vater, gehört zum Vater... na ja.
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Nächste

Zurück zu Konzeption und Vorgehensweise

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron