Empfehlungen: Erweiterte Suche

Beziehungsprobleme in Musik-Datenbank (verzwickt)

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

Re: Beziehungsprobleme in Musik-Datenbank (verzwickt)

Beitragvon enigmartin » Do 26. Mai 2011, 06:47

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

Ja, genau das ist von MySQL Workbench

mbrod hat geschrieben: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.

Ja, alle zugeordneten Künstler waren auch vorher schon da, konnten aber nicht zweifelsfrei einem Lied zugeordnet werden.

mbrod hat geschrieben: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.)

Ja, gestern abend ist mir nach längerem anschauen auch noch eingefallen das ich als Name artist_id nehmen kann und zwar direkt über die in MySQL Workbench vorgegebene 1:n-Beziehung. Ich habe das ganze nur noch nicht ausprobiert. Ich frag mich auch warum ich das vorher nicht so gemacht habe. Wahrscheinlich weil ich für beide Tabellen schon eine Beziehung hatte und den Glauben hatte das pro Tabelle nur eine Beziehung geht. Ich muss das ganze mal testweise durchbacken dann sehe ich genau wie die Beziehungen in Models von CakePHP gesetzt sind.

Wo es vielleicht Probleme geben wird ist in der add.ctp, da dort nun zwei für Artist stehen, also:
Code: Alles auswählen
 $form->input('Artist'); // artist_id
 $form->input('Artist'); // artists_lyrics


Was ich aber vorher schon mit einer seperaten select gelöst habe, indem ich die Artisten im Controller nochmal auslese und für die Select einen geeigneten array mittels foreach vorbereite und den array dann als optionen an die select-Box weitergebe.[/quote]

mbrod hat geschrieben: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.

Ja, das ist mit ds schlimmste was es beim Datenbank-Design gibt, die Beziehungen. Ich bin schon froh das ich da halbwegs durchblicke. Manch einer kann damit gar nichts anfangen.

Im Anhang nochmal das neue Datenbank-Design
Dateianhänge
db-design.png
db-design.png (78.34 KiB) 98-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 enigmartin » Fr 27. Mai 2011, 12:48

Also, so hat es jetzt endlich geklappt. Ich habe allerdings die artists_id aus der albums-tabelle wieder entfernt.

Wie ich aber vermutete, gab es ein Problem, da ich einmal die hasAndBelongsToMany und die belongsTo in den Models angeben habe, die jeweils die gleiche Benennung hatten. Hatte ich ein array, welches ich nicht erfolgreich mit einer foreach durchlaufen konnte. Ich hatte zwar alle untergeordneten array mit nummerischen Schlüsselwerten aber genau zu den nummerischen Schlüsseln kamen dann noch die alphanummerischen Schlüssel inkl. Wert der Haupt-Künstler, also des Autors den ich zugeordnet habe. Um das zu umgehen konnte ich einfach im lyrics-Model die Benennung für den Autoren bzw. Haupt-Künstler ändern.

Code: Alles auswählen
<?php
class Lyric extends AppModel {
    var $name = 'Lyric';
    var $displayField = 'name';
    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'MainArtist' => array(
            'className' => 'Artist',
            'foreignKey' => 'artist_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    var $hasAndBelongsToMany = array(
        'Album' => array(
            'className' => 'Album',
            'joinTable' => 'albums_lyrics',
            'foreignKey' => 'lyric_id',
            'associationForeignKey' => 'album_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        ),
        'Artist' => array(
            'className' => 'Artist',
            'joinTable' => 'artists_lyrics',
            'foreignKey' => 'lyric_id',
            'associationForeignKey' => 'artist_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

}
?>


So wurde aus Artist in der belongsTo-Beziehung MainArtist und ich hatte nun zwei getrennte array, einmal Artist und einmal MainArtist. Verständlich oder?

Nun habe ich nur noch das Problem das ich die Lieder nicht nach der Titelnummer ordnen kann, aber ich hab mir deswegen erstmal noch nicht so viele Gedanken gemacht. Bin erstmal froh die Hürde geschafft zu haben. Wenn es keinen sauberen Weg mittels CakePHP gibt, dann werde ich vielleicht das Array via reinem PHP sortieren. Bei den paar Liedern pro Album sollte das nicht viel Geschwindigkeit ausmachen, oder?
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 » Fr 27. Mai 2011, 23:43

Ja, klasse, dass es jetzt funktioniert.

Wegen Sortierung hatte ich weiter oben schon geschrieben
Code: Alles auswählen
$this->Lyric->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

Vorherige

Zurück zu Konzeption und Vorgehensweise

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron