penter: tags zur titelbeschreibung

guten tag,

ich arbeite gerade an der digitalen umsetzung meiner schallplattensammlung, die ich komplett mit AJAX/PHP/MySql aubgebaut habe.

Die Grundfunktionen wie eintragen von Platten / Labels / Künstlern und ausgeben / filtern der Datenbankeinträge funktionieren schon,
jetzt möchte ich den Titeln eines Albums Adjektive (tags) hinzufügen, die die stücke beschreiben sollen. Stücke werden bei mir in einer tracks Tabelle eingetragen und mit einer RecordID einem Album zugeordnet.

Nach Googlen und Suchen in verschiedenen Foren bin darauf gestoßen, das ich eine 1:n Kardinalität für eine Neue Spalte der Tracks-Tabelle benötige.(ein Titel hat mehrere tags)

Meine Idee ist, die Tags ( oder die TagIDs ) in einer Art Array in die Tabelle einzutragen, oder ist das der falsche Weg?
oder habt ihr eine bessere Lösung? Es muss doch noch jemand dieses Problem haben.

vielen dank im Vorraus,
-philipp

  1. jetzt möchte ich den Titeln eines Albums Adjektive (tags) hinzufügen, die die stücke beschreiben sollen. Stücke werden bei mir in einer tracks-Tabelle eingetragen und mit einer RecordID einem Album zugeordnet.

    Nach Googlen und Suchen in verschiedenen Foren bin darauf gestoßen, das ich eine 1:n-Kardinalität für eine Neue Spalte der Tracks-Tabelle benötige.(ein Titel hat mehrere tags)

    Ich weiß zwar nicht so recht, was eine 1:n-Kardinalität ist (hört sich allerdings doll fachmännisch an), aber die Lösung Deines Problems ist eine zusätzliche Tabelle, in der jedes Adjektiv einzeln mit der dazugehörigen Stück-Nummer abgespeichert wird.

    1. hm. das wäre auch möglich. aber geht es nicht so:
      ich füge in eine spalte Tags der Tracks-Tabelle nur zum beispiel 1,2,5 ein und in einer anderen Tags-Tabelle steht dann:

      tagID, tagName
      1, rock
      2, pop
      ...

      meine frage ist jetzt: wie schreibe ich das in eine datenbank?
      bzw. wie muss ich es schreiben, damit es richtig ausgelesen werden kann?

      benötigt man serialize oder so etwas?

      p.s.: 1:n bedeutet, dass ein eintrag (musikstück) mehrere verbindungen zu anderen einträgen(tags) hat.

      philipp

      1. Hi,

        hm. das wäre auch möglich. aber geht es nicht so:

        ja, das geht nicht so.

        ich füge in eine spalte Tags der Tracks-Tabelle nur zum beispiel 1,2,5 ein und in einer anderen Tags-Tabelle steht dann:

        tagID, tagName
        1, rock
        2, pop
        ...

        Fein. Und wo ist der Eintrag mit der Tag-ID "1,2,5"?

        Inhalte einer Tabellenzelle sind atomar.

        meine frage ist jetzt: wie schreibe ich das in eine datenbank?

        Die Tags-Tabelle referfenziert den jeweiligen Datensatz der Tracks-Tabelle. Wenn sich die Tags, wie mir scheint, wiederholen, ist auch dieses Konzept mangelbehaftet; Du benötigst eine n:m-Beziehung, also eine Kreuztabelle.

        benötigt man serialize oder so etwas?

        Nein. Deine Frage hat übrigens zu 0% Kontakt mit PHP. Sie ist ausschließlich datenbankbezogen.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. gut.
          was empfiehlst du?

          1. Hi,

            was empfiehlst du?

            eine Kreuztabelle, um die n:m-Beziehung abzubilden.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. offengestanden habe ich keine ahnung, wie diese aussehen soll.
              soll ich dich fragen?

              1. Hai,

                das koennte dann in etwa so aussehen:

                CREATE TABLE meineCDs {  
                  cdID    int(11) NOT NULL auto_increment,  
                  cdTitel varchar(99) NOT NULL default '',  
                  PRIMARY KEY (cdID)  
                };  
                CREATE TABLE meineTags {  
                  tgID    int(11) NOT NULL auto_increment,  
                  tagName varchar(99) NOT NULL default '',  
                  PRIMARY KEY (tgID)  
                };  
                CREATE TABLE meinKreuz {  
                  cdID    int(11) NOT NULL default 0,  
                  tgID    int(11) NOT NULL default 0,  
                  UNIQUE KEY (cdID, tgID)  
                };
                

                Natuerlich kann man in die erste Tabelle noch andere Felder, wie z.B. Band,
                Verlag, Erscheinungsjahr oder was sonst noch interessiert, aufnehmen.

                Gruss Norbert

                1. danke für deine hilfe.
                  jetzt weiss ich, dass ich eine hilfstabelle benötige.
                  die erste tabelle habe ich ja schon. die zweite weist jeder Tag-ID einen Namen zu, sofern ich das richtig verstanden habe. Wenn ich jetzt einer CD einen tag zuweisen will kann ich das über die id machen.
                  aber wie sieht das im detail aus?

                  bei mir sieht ein insert so aus:

                  INSERT INTO records (
                  recordID ,
                  artistID ,
                  recordname ,
                  year ,
                  type ,
                  labelID ,
                  recordsize ,
                  genreID
                  )
                  VALUES (
                  NULL , '', '', '', '', '', '', '');

                  trage ich die tags nicht in die cd-tabelle ein?

                  1. jetzt weiss ich, dass ich eine hilfstabelle benötige.
                    die erste tabelle habe ich ja schon. die zweite weist jeder Tag-ID einen Namen zu, sofern ich das richtig verstanden habe. Wenn ich jetzt einer CD einen tag zuweisen will kann ich das über die id machen.

                    Also eine Frage hätte ich jetzt doch: Hast Du zu viel Zeit, wirst Du nach Codezeilen bezahlt oder warum suchst Du auf Teufel komm raus eine Von-hinten-durch-die-Brust-ins-Auge-Methode?

                    1. was meinst du damit?
                      wenn ich vielleicht etwas umständlich an die sache rangehe,
                      dann liegt das daran, dass ich das auch zum ersten mal mache.

                      gruß

                      1. warum suchst Du auf Teufel komm raus eine Von-hinten-durch-die-Brust-ins-Auge-Methode?

                        was meinst du damit?

                        Du arbeitest Dich über viele Umwege an eine Lösung heran, die bereits aufgezeigt wurde. Der einzige Unterschied ist momentan noch, dass bei Dir jedes Attribut ein Nümmerchen bekommen soll, anstatt es direkt zu speichern.

                        1. Hai Mork,

                          wenn man etwas nicht kapiert kann das fuenf Gruende haben:

                          • man hat keine Ahnung
                          • man hat ueberhaupt keine Ahnung
                          • man wohnt auf der Mondrueckseite
                          • man ist frisch aus dem Ei gekrochen
                          • der Vorredner hat sich einfach mal geirrt

                          Warum haengst Du Dich auf Teufel komm raus in Threads,
                          von denen Du, nach eigener Aussage, keinen blassen Dunst hast?

                          HTH
                          Kaspar Hauser

                  2. trage ich die tags nicht in die cd-tabelle ein?

                    Ja

      2. hm. das wäre auch möglich. aber geht es nicht so:
        ich füge in eine spalte Tags der Tracks-Tabelle nur zum beispiel 1,2,5 ein und in einer anderen Tags-Tabelle steht dann:

        tagID, tagName
        1, rock
        2, pop

        Dann musst Du erst das Attribut zur Attributs-ID auflösen, anschließend mit einem Volltextindex die Tracks-Tabelle durchforsten, denn anders bekommst Du "1,2,5" nicht nicht in eine Spalte. Höchstens wäre ein SET noch denkbar, aber dieser Typ ist a) beschränkt auf 64 Werte und b) müssen diese Werte vorab bekannt sein.

        Ergo zwei Abfragen, eine davon in sich aufwendig (Auslösen eines Attributs aus dem kommagetrennten Text) und mit einem aufwendigeren Index.
        Da Du eh einen Volltextindex benötigst, könntest Du die Attribut-ID-Verbindung auch lassen und statt "1,2,5" direkt "rock,pop,lustig" speichern, spart eine Abfrage, bleibt aber immer noch der aufwendige Index und die aufwendige Abfrage.

        Schreibst Du wie vorgeschlagen eine zusätzliche Tabelle Attribut -> Titelnummer, benötigst Du nur eine Abfrage und kannst einen einfachen Index bemühen (lassen).