webForumDet fria alternativet

Spara flera ID i samma kolumn!!?

Databaser & SQL

9 svar · 500 visningar · startad av Guldstrand

Medlem sedan juli 20041 271 inlägg
Frågan#1

Kan man spara flera (olika) ID:n i samma kollum?

Alltså jag har en kollum som heter "lyric_id" i min artist tabell, och jag skulle behöva spara fler än bara ett ID i det fältet. (Klurigt att förklara.)

Om vi säger att jag har 5 st. lyrics/texter till samma artist, då vill jag kunna lägga till/spara alla ID:n i kollumen "lyrics_id".

Jag har försökt med t.e.x 1, 2, 3, 4... men det verkar bara gå att spara ett ID i den kollumen. :l

Medlem sedan feb. 20011 198 inlägg
#2

Du kan antingen använda en korsreferenstabell eller göra om ditt fält till varchar.
Det förstnämnda är att rekommendera.

Medlem sedan nov. 2000857 inlägg
#3

Flyttas från PHP..

Medlem sedan juni 200032 967 inlägg
#4

Det är en dålig idé att lagra flera saker i samma fält. Lyssna du på yohpops.

Medlem sedan juli 20041 271 inlägg
#5

yohpops skrev:

Du kan antingen använda en korsreferenstabell eller göra om ditt fält till varchar.
Det förstnämnda är att rekommendera.

Hmm, ok..
Hur menar du med "korsreferenstabell"? :r

Jag har följande tabeller:

CREATE TABLE `artister` (
  `id` int(11) NOT NULL auto_increment,
  `kat_id` int(10) unsigned NOT NULL default '0',
  `musicid` int(10) unsigned NOT NULL default '0',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `anamn` varchar(80) NOT NULL default '',
  `fnamn` varchar(80) NOT NULL default '',
  `birthday` date NOT NULL default '0000-00-00',
  `formed` date NOT NULL default '0000-00-00',
  `land` int(10) unsigned NOT NULL default '0',
  `medlemmar` text NOT NULL,
  `artist_foto` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `webb` varchar(100) NOT NULL default '',
  `lyric_id` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `anamn` (`anamn`),
  KEY `musicid` (`musicid`,`lyric_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=254 ;

CREATE TABLE `genre_music` (
  `id` int(11) NOT NULL auto_increment,
  `genre` varchar(80) NOT NULL default '',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `kat_ikon` varchar(50) NOT NULL default '',
  `g_info` varchar(255) NOT NULL default '',
  `artist_id` int(10) unsigned NOT NULL default '0',
  `musicid` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `artist` (`artist_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ;

CREATE TABLE `labels` (
  `id` tinyint(3) NOT NULL auto_increment,
  `lnamn` varchar(100) NOT NULL default '',
  `logo` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `webb` varchar(50) NOT NULL default '',
  `musicid` int(10) unsigned NOT NULL default '0',
  `artist_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `artist_id` (`artist_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=41 ;

CREATE TABLE `lyrics` (
  `id` int(10) NOT NULL auto_increment,
  `artist_id` int(11) unsigned NOT NULL default '0',
  `musicid` int(11) unsigned NOT NULL default '0',
  `titel` varchar(50) NOT NULL default '',
  `artistnamn` varchar(50) NOT NULL default '',
  `text` text NOT NULL,
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=127 ;

CREATE TABLE `music` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `artist_id` int(10) unsigned NOT NULL default '0',
  `kat_id` int(10) unsigned NOT NULL default '0',
  `media` enum('album','singel','dvd','ej angivet') NOT NULL default 'album',
  `label_id` int(10) unsigned NOT NULL default '0',
  `lyric_id` int(10) unsigned NOT NULL default '0',
  `tid` varchar(10) NOT NULL default '',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `datum_uppd` datetime NOT NULL default '0000-00-00 00:00:00',
  `titel` varchar(100) NOT NULL default '',
  `tracks` varchar(50) NOT NULL default '',
  `release` date NOT NULL default '0000-00-00',
  `m_covers` varchar(100) NOT NULL default '',
  `m_info` text NOT NULL,
  `ean` varchar(50) NOT NULL default '',
  `buylink` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `artist_id` (`artist_id`,`kat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ;
Medlem sedan mars 20034 471 inlägg
#6

Guldstrand skrev:

... Om vi säger att jag har 5 st. lyrics/texter till samma artist, då vill jag kunna lägga till/spara alla ID:n i kollumen "lyrics_id".

Jag har försökt med t.e.x 1, 2, 3, 4... men det verkar bara gå att spara ett ID i den kollumen. :l

Du har alltså en tabell med artister där ID:T heter artistID (tex).
En annan tabell Lyric med ID lyricID (tex). För att binda ihop dem på ett vettigt sätt skapar du en tabell Sjunger (eller annat lämpligt namn) med två ID:n, dels artistID, dels lyricID. Alltså:

Artist ((artistID) namn, ....)
Lyric ((lyricID) text, längd, ...)

CREATE VIEW Sjunger(
artistID int NOT NULL,
lyricID int NOT NULL,
PRIMARY KEY (artistID, lyricID),
FOREIGN KEY(artistID) REFERENCES Artist,
FOREIGN KEY(lyricID) REFERENCES Lyric)

Om artist 1 framför 1, 2, 3, 4 och artist 2 sjunger 1 och 15 så sparas den infon sedan i sjunger som:

artistID lyricID
1          1
1          2
1          3
1          4
2          1
2          15
Medlem sedan juli 20041 271 inlägg
#7

Fick lite hjälp i ett annat forum, men nu är jag "fast" igen. :(

Dr. Flink skrev:

Det tror jag inte att du gjort. Det ser väl helt ok ut nu?
...testa att måla upp det för dig om du är osäker, brukar hjälpa. Gjorde en snabbskiss på hur jag menar.

Skrev 'Items', men det ska väl stå 'music' där...men iallafall, det är själva produkten som i sin tur är kopplad till media, som skall visa om det är en dvd/singel/album...

Ok... :?

Nu har jag följande tabeller:

 CREATE TABLE `artister` (
  `artist_id` int(10) NOT NULL default '0',
  `group_id` int(10) NOT NULL default '0',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `datum_uppd` datetime NOT NULL default '0000-00-00 00:00:00',
  `anamn` varchar(80) NOT NULL default '',
  `fnamn` varchar(80) NOT NULL default '',
  `birthday` date NOT NULL default '0000-00-00',
  `land` int(10) unsigned NOT NULL default '0',
  `artist_foto` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `extra` text NOT NULL,
  `webb` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`artist_id`),
  UNIQUE KEY `anamn` (`anamn`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `genre_music` (
  `genre_id` int(10) NOT NULL default '0',
  `namn` varchar(50) NOT NULL default '',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `kat_ikon` varchar(50) NOT NULL default '',
  `g_info` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`genre_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `group` (
  `group_id` int(10) NOT NULL default '0',
  `music_id` int(10) NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  `formed` date NOT NULL default '0000-00-00',
  `info` text NOT NULL,
  PRIMARY KEY  (`group_id`,`music_id`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `labels` (
  `id` tinyint(3) NOT NULL auto_increment,
  `lnamn` varchar(100) NOT NULL default '',
  `logo` varchar(100) NOT NULL default '',
  `info` text NOT NULL,
  `webb` varchar(50) NOT NULL default '',
  `musicid` int(10) unsigned NOT NULL default '0',
  `artist_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `artist_id` (`artist_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=41 ;

CREATE TABLE `lyrics` (
  `id` int(10) NOT NULL auto_increment,
  `titel` varchar(50) NOT NULL default '',
  `artistnamn` varchar(50) NOT NULL default '',
  `text` text NOT NULL,
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=127 ;

CREATE TABLE `lyrics_group` (
  `lyrics_id` int(10) NOT NULL default '0',
  `group_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`lyrics_id`,`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `media` (
  `media_id` int(10) NOT NULL default '0',
  `namn` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`media_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `music` (
  `music_id` int(10) NOT NULL default '0',
  `media_id` int(10) NOT NULL default '0',
  `tid` varchar(10) NOT NULL default '',
  `datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `datum_uppd` datetime NOT NULL default '0000-00-00 00:00:00',
  `titel` varchar(100) NOT NULL default '',
  `tracks` varchar(50) NOT NULL default '',
  `release` date NOT NULL default '0000-00-00',
  `m_covers` varchar(100) NOT NULL default '',
  `m_info` text NOT NULL,
  `ean` varchar(50) NOT NULL default '',
  `buylink` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`music_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `music_group` (
  `music_id` int(10) NOT NULL default '0',
  `group_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`music_id`,`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Nu till en (kanske DUM fråga för de flesta), men i VILKEN tabell ska jag nu spara id:et för album/singel? :r

Måste jag spara id:et för albumet/singeln i alla tabeller som innehåller "music_id" (alltså i "items_group" + "items")?

Damn... hade verkligen sett fram imot en mer förenklad version av alla map-tabeller. 8-O

Tar tacksamt imot fler förslag på hur jag kan designa min databas.

Medlem sedan jan. 20022 440 inlägg
#8

Det ser jättefint ut som du strukturerat upp det hela! Jag hade nog valt att ha lyrics knutet till varje album och spår som artisten hade gjort istället och tagit bort relationen mellan artist och lyricsgroup helt.

Fast å andra sidan kanske du inte vill knyta ihop mediatyperna med lyrics?

Medlem sedan juli 20041 271 inlägg
#9

CatZ skrev:

Det ser jättefint ut som du strukturerat upp det hela! Jag hade nog valt att ha lyrics knutet till varje album och spår som artisten hade gjort istället och tagit bort relationen mellan artist och lyricsgroup helt.

Fast å andra sidan kanske du inte vill knyta ihop mediatyperna med lyrics?

Jodå, det går ju också bra.
Det jag vill, är att man ska kunna "komma åt" sångtexterna både från artist-sidan (kopplade till artisten såklart), men också från musik-sidan (där all info om albumet/spår finns.)
Men det kanske räcker med att spara id:et för lyrics i musik-tabellen, och sedan köra den vägen!!?

Medlem sedan jan. 20022 440 inlägg
#10

Jo men du måste ju ändå knyta lyrics till någon sorts lista över album och sånger? Det verkar ju lite konstigt om det bara dyker upp massa lyrics utan sångtitel, och sångtitel brukar i sin tur vara knuten till albumtitel som i sin tur är knuten till artist.

Det är inget måste men jag tycker det verkar mer logiskt på det viset! ;) Du behöver inte relationerna i din dbs du kan hämta vilka värden som helst hur som helst. MEN att skapa relationer och relationsintegritet ser till att du får ett säkrare system.

Det blir dessutom lättare att skapa frågor och vyer osv eftersom din databashanterare kan underlätta för dig.

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)