Terve
Mulla on taulut cds, artists, genres ja songs tietokannassa. cds-taulu sisältää ID-numeron, CD-levyjen nimet, artistien nimet, julkaisuvuodet ja genret. artists-taulu sisältää ID-numeron ja artistin nimen. genre-taulussa on kentät id ja genre. songs sisältää kentät id, title, album, track ja length.
Tietokoneelta löytyy yhden kansion alta kansiorakenne, jossa ensimmäinen kansio on artistin nimi ja seuraava albumin nimi jonka alta löytyy kappaleet (artisti -> albumi -> kappale). Nyt tarkoitus olisi ohjelmallisesti käydä koko kansio läpi ja syöttää tiedot tietokantaan ja muuttaa osaa tiedoista, jotka jo ovat tietokannassa.
1. cds-taulun kentissä artist ja genre on tekstiarvo tällä hetkellä. Tarkoitus olisi kyselyllä käydä läpi koko taulu ja korvata artist-kentän arvo artists-taulusta löytyvällä ID-numerolla. Esimerkiksi cds-taulun artist-sarakkeen arvo "Michael Jackson" muuttuisi numeroksi 15, joka on artistin ID-numero tietokannassa. Toisena kyselynä pitäisi muuttaa cds-taulun sarakkeen genre arvot myös id-numeroiksi. Nyt genre-sarake sisältää genret pilkulla eroteltuna, esimerkiksi "pop,r'n'b". Tarkoitus olisi siirtää molemmat arvot genres-tauluun ja korvata tekstiarvot cds-taulusta ID-numeroilla, jotka genres-tauluun ilmestyvät. Esimerkiksi kun "pop,r'n'b" siirretään genres-tauluun, tauluun ilmestyy kaksi tietuetta pop ja r'n'b, esimerkiksi ID-arvoilla 1 ja 2. Sitten cds-taulusta pitäisi korvata pop ja r'n'b niiden ID-numeroilla. Sama genre ei saa esiintyä genres-taulussa useammin kuin kerran, jotta myöhemmin voidaan hakea cds-taulusta esimerkiksi kaikki levyt, joiden genre sisältää arvon 1.
2. Kuvitellaan, että ollaan kansiossa Musiikki -> Michael Jackson -> Bad. Nyt PHP-skripti tunnistaa, että ollaan viimeisessä kansiossa ja se lähtee syöttämään tietokantaan kappaleita. Kansioiden nimistä se saa esittäjän ja albumin nimen. Nyt pitäisi syöttää tietokantaan uusi tietue, jossa olisi näitä tietoja. Kumminkin, kun songs-taulun album- ja artist-kentät tulevat sisältämään vain ID-numeron, tauluista artists ja albums pitäisi hakea kyseiset ID-numerot. Tämä onnistuu kolmella erilisellä kyselyllä, mutta todennäköisesti tähän on tehokkaampi ratkaisu.
Näihin kahteen asiaan tarvitsisin neuvoja ja apuja. Jos tulee parempia ideoita tiedon säilyttämiseen, niin sopii antaa.
Mihin tarkalleen ottaen tarvitsisit apua? Jos kokeilet ratkaista ongelman ensin ja sitten jos joku kohta tuottaa ylitsepääsemättömiä ongelmia, niin voisit kysyä niistä. Nyt tuossa en huomaa mitään ilmiselviä kipukohtia vaan ihan vartin tai parin peruskoodauksesta olisi kysymys.
Tietoja hakiessa voit käyttää erillisten kyselyjen asemesta SQL:n JOIN toimintoa.
Macro kirjoitti:
cds-taulun kentissä artist ja genre on tekstiarvo tällä hetkellä. [..] Nyt genre-sarake sisältää genret pilkulla eroteltuna, esimerkiksi "pop,r'n'b".
Poistaisin koko genre-sarakkeen ja tekisin erillisen taulun cd_genres jossa on sarakkeet cd_id ja genre_id. Oma indeksi kummallekin sarakkeelle ja uniikki indeksi joka sisältää molemmat.
Pilkuilla erotellut arvot tuottavat varmasti tuskaa enemmin tai myöhemmin.
Macro kirjoitti:
hakea cds-taulusta esimerkiksi kaikki levyt, joiden genre sisältää arvon 1.
SELECT cds.* FROM cds, cd_genres WHERE cds.id = cd_genres.cd_id AND cd_genres.genre_id = 1
Macro kirjoitti:
Tämä onnistuu kolmella erilisellä kyselyllä, mutta todennäköisesti tähän on tehokkaampi ratkaisu.
Todennäköisesti et tarvitse tehokkaampaa ratkaisua.
Aihe on jo aika vanha, joten et voi enää vastata siihen.