Miten onnistuu ?

Taulun rakenne on: ID (int), nimi (varchar), ainekset (varchar).

Data on laitettu näin:

"1" , "pizza1", "metvursti | ketsuppi | paprika"
"2" , "pizza2", "sipuli | ketsuppi | sienet"
jne...

(kun tiedot haitaan tietokannasta ja tulostetaan web-sivulle erotinmerkki: "|" korvataan html käskyllä )

Nyt ajattelin järjestää tietokannan paremmin.

Ajattelin tehdä kolme taulua:

pizzat (ID, nimi);
ainekset (ID, nimi);
täytteet (ID_pizza, ID_aines);

Onko tämä fiksua? Kun tietokannasta etsitään ainekset pizzanimen perusteella? Nyt riittää yksi yksi haku, mutta muutoksen jälkeen suorituskyky putoa, vai mitä?


Ja nyt tärkein kysymys, miten tuon muutoksen voisi tehdä ilma tietojen syöttöä käsiin uudestaan?
9360
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Kai niissä tauluissa pitäis joku yhteinen id-olla, joka yhdistäis kaikki pitsan osa-alueet yhteen.

Äänestä

Pizza
pid | nimi
1 | Tuttifrutti


Aineet
id | pid | aines | tayte
1 | 1 | jauho | n
2 | 1 | juusto | y
3 | 1 | tomaatti | y


id = juokseva luku
pid = pizzan id (juokseva luku)
täyte = n tai y, sen mukaan onko täyte vai pohjan aines



SELECT * FROM pizza
JOIN aineet as a USING(pid)
JOIN aineet as a2 USING(pid)

WHERE
a.aines = 'juusto' AND
a.tayte = 'y'

Tai sitten alikyselyllä, joka on hitaampa

SELECT * FROM pizza
JOIN aineet USING(pid)
WHERE id IN (

SELECT id FROM aineet
WHERE
aines = 'juusto' AND
tayte = 'y'

Palauttaa ne pizzat aineineen jossa on käytetty täytteenä juustoa.




SELECT * FROM pizza
JOIN aineet USING(pid)

WHERE
aines = 'juusto' AND
a.tayte = 'y'

Palauttaa pizzan nimen jossa täytteenä juustoa, josta voi tehdä linkin ja laittaa id tunnisteen, jolloin reseptin saa yksinkertaisesti näin


SELECT * FROM pizza
JOIN aineet USING(pid)

WHERE
pizza.pid = 1











Suorituskyky ei todellakaan putoa useamman taulun liitoksella verrattuna siihen jos kaikki tiedot samaan tauluun laittaa. Sehän on tietokannan yksi perusideoista.

Tota esimerkki voi parantaa tekemällä kolmannen taulun jossa on luoteltu aineet ja täytteet, näin vältyttäisiin turhalta toistolta sekä aineitten nimiä on helpompa muuttaa.

Äänestä
  • Näin saat helposti aineet samaan

    SELECT *, GROUP_CONCAT(a2.aineet) FROM pizza
    JOIN aineet as a USING(pid)
    JOIN aineet as a2 USING(pid)

    WHERE
    a.aines = 'juusto' AND
    a.tayte = 'y'

    GROUP BY a.pid


    Sekä aines = aineet taulukon nimes

    Äänestä

  • Pizza
    pid | nimi
    1 | Tuttifrutti


    Aineet
    id | pid | aines | tayte
    1 | 1 | jauho | n
    2 | 1 | juusto | y
    3 | 1 | tomaatti | y


    Eli ei missään tapauksessa näin, vaan ehdottomasti kolmea taulukkoa käyttäen:

    Pizza(PizzaID, Nimi)
    Aineet( AineID, Nimi)
    Menu( PizzaID, AineID)

    Ja sitten pitsalle täytteet seraavalla kyselyllä:

    SELECT Aineet.Nimi FROM Pizza, Aineet, Menu
    WHERE Pizza.Nimi = 'PizzanNimi'
    AND Menu.PizzaID = Pizza.PizzaID
    AND Menu.AineID = Aineet.AineID;

    Äänestä

  • ZiPA kirjoitti:

    Pizza
    pid | nimi
    1 | Tuttifrutti


    Aineet
    id | pid | aines | tayte
    1 | 1 | jauho | n
    2 | 1 | juusto | y
    3 | 1 | tomaatti | y


    Eli ei missään tapauksessa näin, vaan ehdottomasti kolmea taulukkoa käyttäen:

    Pizza(PizzaID, Nimi)
    Aineet( AineID, Nimi)
    Menu( PizzaID, AineID)

    Ja sitten pitsalle täytteet seraavalla kyselyllä:

    SELECT Aineet.Nimi FROM Pizza, Aineet, Menu
    WHERE Pizza.Nimi = 'PizzanNimi'
    AND Menu.PizzaID = Pizza.PizzaID
    AND Menu.AineID = Aineet.AineID;

    Niin, siis olihan tuossa edelläkin jo kehotettu käyttämään tuota kolmen taulun rakennetta. Sen verran haluaisin kuitenkin vielä niitä Jokusen esimerkkejä kommentoida, että mikäli näet kyselyssäsi lauseen "SELECT *", on syytä miettiä asia uudestaan. Tuota nimittäin hyvin, hyvin harvoin tarvitaan, joten sen käyttö on hyvin, hyvin turhaa. Olettaisinkin, että Jokunen tämän jo tietääkin, mutta silti, niiden käyttöä kannattaa esimerkeissäkin välttää, ettei kukaan vahingossakaan opi tuota huonoa tapaa... :)

    Äänestä

  • ZiPA kirjoitti:

    Niin, siis olihan tuossa edelläkin jo kehotettu käyttämään tuota kolmen taulun rakennetta. Sen verran haluaisin kuitenkin vielä niitä Jokusen esimerkkejä kommentoida, että mikäli näet kyselyssäsi lauseen "SELECT *", on syytä miettiä asia uudestaan. Tuota nimittäin hyvin, hyvin harvoin tarvitaan, joten sen käyttö on hyvin, hyvin turhaa. Olettaisinkin, että Jokunen tämän jo tietääkin, mutta silti, niiden käyttöä kannattaa esimerkeissäkin välttää, ettei kukaan vahingossakaan opi tuota huonoa tapaa... :)

    Oikeessa olet tuossa SELECT * asiassa, itselläni on pahatapa laittaa se tottumuksesta esimerkkeihin, kun sitä tulee itse käytettyä usein kyselyn rakenteluvaiheessa, jotta näkee mitä rivejä/tietoja kysely hakee. Usein vain jää vastauksesta pois huomautus, että se pitäs muuttaa, kun on näitä perusjuttuja jotka jokainen tietää ;)

    Onhan kolmen taulun käyttö huomattavasti parempa tapa kuin toi minun kahden, mutta jos pizzoja muutama, on niin ja näin onko siitä todellista hyötyä, tosin pienetkin asiat kannattaisi tehdä aina hyvin, eikä helpoimmalla tavalla.

    Sinun esimerkkiisi pitää lisätä vielä aineet taulukkoon sarake, joka kertoo onko kyseessä täyte vaiko pohjan aines.

    Äänestä

  • Jokunen kirjoitti:

    Oikeessa olet tuossa SELECT * asiassa, itselläni on pahatapa laittaa se tottumuksesta esimerkkeihin, kun sitä tulee itse käytettyä usein kyselyn rakenteluvaiheessa, jotta näkee mitä rivejä/tietoja kysely hakee. Usein vain jää vastauksesta pois huomautus, että se pitäs muuttaa, kun on näitä perusjuttuja jotka jokainen tietää ;)

    Onhan kolmen taulun käyttö huomattavasti parempa tapa kuin toi minun kahden, mutta jos pizzoja muutama, on niin ja näin onko siitä todellista hyötyä, tosin pienetkin asiat kannattaisi tehdä aina hyvin, eikä helpoimmalla tavalla.

    Sinun esimerkkiisi pitää lisätä vielä aineet taulukkoon sarake, joka kertoo onko kyseessä täyte vaiko pohjan aines.

    Tuo unohtui, pitäisi tietenkin olla, mikäli asiasta ollaan kiinnostuneita. Tuon ensimmäisen viestin perusteella oletin että ainoa mielenkiinnon kohde on täytteet. Samaan päädyin pizzoista omaamani kokemusten perusteella... :)

    Ja vielä tuosta "hyvin tekemisestä": ikinä ei kannata mennä siitä yli, mistä aita on matalin. Monesti se saattaa toimia, etenkin jos on ns. huvikseen tehdyistä projekteista kyse, mutta sitten kun tulee vastaan se tilanne, että homma ei enää toimikkaan, on edessä armoton vitutus sekä korjaamisprojekti. Kumpikaan ei ole järin mukavaa... :)

    Äänestä

  • ZiPA kirjoitti:

    Tuo unohtui, pitäisi tietenkin olla, mikäli asiasta ollaan kiinnostuneita. Tuon ensimmäisen viestin perusteella oletin että ainoa mielenkiinnon kohde on täytteet. Samaan päädyin pizzoista omaamani kokemusten perusteella... :)

    Ja vielä tuosta "hyvin tekemisestä": ikinä ei kannata mennä siitä yli, mistä aita on matalin. Monesti se saattaa toimia, etenkin jos on ns. huvikseen tehdyistä projekteista kyse, mutta sitten kun tulee vastaan se tilanne, että homma ei enää toimikkaan, on edessä armoton vitutus sekä korjaamisprojekti. Kumpikaan ei ole järin mukavaa... :)

    Lukasin silloin yöllä huolimattomasti, ei siellä nyt enään mainittukaan mitään pohjasta ;). Tosin täytteiden ohella myös pohja on tärkeä asia, kyllä pohjistakin löytyy todella paljon makueroja sekä eritoten millanen siitä tulee koostumukseltaan, useisiin pizzoihin käy pohjaksi ihan perus pizza taikinasta tehty, myös sillä on taikinan kannalta merkitystä tekeekö pannupizzan vai ei.


    Eihän sitä kannattaisikaan mennä siitä yli mistä aita on matalin, mutta houkutus on suuri ;)

    Tosin jos noita huvikseen tehtyjä projekteja alkaa tekemään kunnolla, niin useinmiten koodi rivit paisuvat paisumistaan eikä projekti valmistu kokonaan ikinä, vaikka piti olla vain pienen pieni scriptin pätkä ;)

    Äänestä

  • Jokunen kirjoitti:

    Lukasin silloin yöllä huolimattomasti, ei siellä nyt enään mainittukaan mitään pohjasta ;). Tosin täytteiden ohella myös pohja on tärkeä asia, kyllä pohjistakin löytyy todella paljon makueroja sekä eritoten millanen siitä tulee koostumukseltaan, useisiin pizzoihin käy pohjaksi ihan perus pizza taikinasta tehty, myös sillä on taikinan kannalta merkitystä tekeekö pannupizzan vai ei.


    Eihän sitä kannattaisikaan mennä siitä yli mistä aita on matalin, mutta houkutus on suuri ;)

    Tosin jos noita huvikseen tehtyjä projekteja alkaa tekemään kunnolla, niin useinmiten koodi rivit paisuvat paisumistaan eikä projekti valmistu kokonaan ikinä, vaikka piti olla vain pienen pieni scriptin pätkä ;)

    Niin no, samalla pitää kuitenkin myös muistaa, että kun kerran tekee kyselyt hyvin niistä voi myös ammentaa paljon seuraaviin projekteihin. Vaikka itse data kuinka muuttuisikin erilaiset vikasietoisuutta parantavat varmistukset ovat hyvinkin samanlaisia. Olipa taulussa pizzoja tai autonrenkaita, NULLit pysyvät :)

    Äänestä

Kommentoi aloitusta


noobix kirjoitti:

Taulun rakenne on: ID (int), nimi (varchar), ainekset (varchar).

Data on laitettu näin:

"1" , "pizza1", "metvursti | ketsuppi | paprika"
"2" , "pizza2", "sipuli | ketsuppi | sienet"
jne...

(kun tiedot haitaan tietokannasta ja tulostetaan web-sivulle erotinmerkki: "|" korvataan html käskyllä )

Nyt ajattelin järjestää tietokannan paremmin.

Ajattelin tehdä kolme taulua:

pizzat (ID, nimi);
ainekset (ID, nimi);
täytteet (ID_pizza, ID_aines);

Onko tämä fiksua? Kun tietokannasta etsitään ainekset pizzanimen perusteella? Nyt riittää yksi yksi haku, mutta muutoksen jälkeen suorituskyky putoa, vai mitä?


Ja nyt tärkein kysymys, miten tuon muutoksen voisi tehdä ilma tietojen syöttöä käsiin uudestaan?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu