tags zur titelbeschreibung
penter
- php
0 Mork bei Bork0 penter1 Cheatah0 penter1 Cheatah0 penter
0 Mork bei Bork
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
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.
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
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
gut.
was empfiehlst du?
Hi,
was empfiehlst du?
eine Kreuztabelle, um die n:m-Beziehung abzubilden.
Cheatah
offengestanden habe ich keine ahnung, wie diese aussehen soll.
soll ich dich fragen?
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
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?
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?
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ß
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.
Hai Mork,
wenn man etwas nicht kapiert kann das fuenf Gruende haben:
Warum haengst Du Dich auf Teufel komm raus in Threads,
von denen Du, nach eigener Aussage, keinen blassen Dunst hast?
HTH
Kaspar Hauser
trage ich die tags nicht in die cd-tabelle ein?
Ja
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).