MySQL kysymys

hankalahko...

Eli on tällainen kaikille avoin editoitavaksi CD-tietokanta.
Tietokantaan kuka tahansa voi lisätä uuden CD-levyn, ja editoida sen tiedot, biisien nimet. Häiriköintitapausten varalle pitäisi toteuttaa "muutoshistoria"-toiminto (vähän niin kuin wikissä).

Tauluja on kolme:

Artisti (id, nimi)
Levy (id, artisti_id, nimi)
Biisi (id, levy_id, raita, nimi)

Mutta miten tuo muutoshistoria kannattaisi toteuttaa? Että etusivulla heti näkisi viimeksi lisätyt ja muokatut levyt?

Miten kannattaisi toteuttaa tietojen palautus, jos joku häirikkö muokkaa oikeat tiedot vääriksi? Myös tuokin operaatio pitäisi tallentaa historiaan, ettei kävisi niin, että joku korjaa väärät tiedot, ja sitten joku häirikkö palauta vanhat väärät tiedot korjattujen tilalle.

Ja vielä lopuksi vielä tällainen tapaus, tietokannassa on vaikka artisti Madonna, ja joku lisää Madonnan uuden levyn, mutta tekee kirjoitusvirheen ja kirjoittaa Madonna yhdellä n-kirjaimella. Järjestelmä ei löydä "Madona" -artistia ja lisää sen kuin se olisi uusi artisti, eli antaa sitten sille uuden id tunnuksen, ja levyn tiedot menevät sitten uuden id tunnuksen alle. Miten voisi toteuttaa näiden tietojen korjaus-toiminnon, niin että kaikki muutokset menisivät myös muutoshistoriaan, ja niin, että muutokset olisivat palautettavissa häiriköintitapauksissa? Tämä on aika hankala tapaus mielestäni.

Tietokanta on MySQL ja kieli PHP

4

448

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • tohlo

      > Mutta miten tuo muutoshistoria kannattaisi
      > toteuttaa? Että etusivulla heti näkisi viimeksi
      > lisätyt ja muokatut levyt?

      Minä tekisin tämän niin, että jokaiseen tauluun lisäisin esim. muutettu- ja status-nimiset kentät. Ekaan laitetaan rivin viimeisin muutosaikaleima (timestamp) ja tokaan jonkinlainen kyseisen rivin status (arvoina esim. 1=voimassa, 2=poistettu.

      Kun joku muokkaa jotain riviä missä tahansa tauluista, tallennetaankin voimassaolevaan riviin statukseksi 2=poistettu JA lisätään samalla uusi rivi, johon laitetaan aiemmallakin rivillä ollut sama id, mahdollinen korjattu nimi, ym. tiedot, sekä tuo kyseinen aikaleima ja statukseksi 1=voimassa (tämä kaikki yhden transaktion sisällä, jolloin virhetapauksissa mitään muutoksia ei minkään taulun riveihin tehdä). Näin uusi muokattu rivi on korvannut vanhan ja muutoshistoria on tallessa, kunhan rivit otetaan näkyviin aikajärjestyksessä. Nyt sitten mikä tahansa aiempi taulun rivi voidaan palauttaa käyttöön hyvin helposti vain muokkaamalla status-kentän arvoja. Aina täytyy pitää kuitenkin huolta siitä, että vain yhdellä rivillä status-kentän arvona on 1=voimassa, muuten voi käydä huonosti. ;)

      Toinen vaihtoehto on tehdä kullekin taululle oma backup-taulunsa, johon siirretään vanha voimassaollut rivi sellaisenaan, ja varsinaisen käyttötaulun rivin arvoa sitten päivitetään lisäämättä uusia rivejä ko. tauluun.

      Sovelluksen kannattanee kirjoittaa jonkinlaista lokia tekemisistä, eli tietojen tallennuksista, palautuksista, jne. Loki voi olla tietokannassa tai sitten vaikkapa ihan vaan tiedostona palvelimen levyllä.

      > Ja vielä lopuksi vielä tällainen tapaus,
      > tietokannassa on vaikka artisti Madonna, ja
      > joku lisää Madonnan uuden levyn, mutta tekee
      > kirjoitusvirheen ja kirjoittaa Madonna yhdellä
      > n-kirjaimella.

      Suosittelen että käyttöliittymässä on jonkinlainen hakutoiminto olemassaolevista artisteista, jolloin aina käyttäjän ei tarvitse kirjoittaa artistin nimeä oikein uuteen levyyn, vaan se valitaan esim. listasta. Vain jos artistia ei varmasti jo löydy taulusta, annetaan se lisätä uutena. (Tässä ehkä tarvitaan jonkinlaista merkkijonojen samanlaisuuden vertailua tjmv. esim. tuossa Madona vs. Madonna -tapauksessa, vrt. www.imdb.com:n haku.)

      > Miten voisi toteuttaa näiden tietojen
      > korjaus-toiminnon, niin että kaikki muutokset
      > menisivät myös muutoshistoriaan, ja niin, että
      > muutokset olisivat palautettavissa
      > häiriköintitapauksissa?

      Korjausoperaatiohan tietokannan osalta on sellainen, että vaihdat vaan siihen väärään artisti-id-arvoon kohdistuvat viittaukset oikeaan. Myös tämä toimenpide tulee siis mennä ylläkuvaamaani lokiin ja myös muutoshistoriaan, jotta se voidaan tarvittaessa perua.

      Ongelmanahan tässä on myös se, että joku voi korjata väärinkirjoitetun Madona-artistin oikeaksi, jolloin olisikin sitten kaksi Madonna-artistia eri id-arvoilla. Mutta toki näidenkin yhdistäminen onnistuu tässä kuvatuin keinoin ja muutoshistoriakin säilyy.

      • hankalahko...

        >Korjausoperaatiohan tietokannan osalta on sellainen, että vaihdat >vaan siihen väärään artisti-id-arvoon kohdistuvat viittaukset >oikeaan. Myös tämä toimenpide tulee siis mennä ylläkuvaamaani >lokiin ja myös muutoshistoriaan, jotta se voidaan tarvittaessa >perua.

        Miten tuon voisi tallentaa historiaan? Jos korjaan viittaukset, niin vanhat viittaukset häviävät, eikä tässä tapauksessa statuksen muuttamisesta ole hyötyä, vaan vanhan viittaukset pitäisi jotenkin johonkin tallentaa?


      • tohlo
        hankalahko... kirjoitti:

        >Korjausoperaatiohan tietokannan osalta on sellainen, että vaihdat >vaan siihen väärään artisti-id-arvoon kohdistuvat viittaukset >oikeaan. Myös tämä toimenpide tulee siis mennä ylläkuvaamaani >lokiin ja myös muutoshistoriaan, jotta se voidaan tarvittaessa >perua.

        Miten tuon voisi tallentaa historiaan? Jos korjaan viittaukset, niin vanhat viittaukset häviävät, eikä tässä tapauksessa statuksen muuttamisesta ole hyötyä, vaan vanhan viittaukset pitäisi jotenkin johonkin tallentaa?

        Oletetaan että esim. artisti-taulussa ovat seuraavat rivit:

        id nimi muutettu status
        1 Madonna 3.8.06 23:40 1 (= voimassa)
        2 Madona 4.8.06 00:15 1

        ja levy-tauluun lisätään uusi rivi:

        id artisti_id nimi muutettu status
        5 2 Best of 4.8.06 00:20 1

        eli "väärälle" Madonnalle. Nyt korjausoperaationa halutaan levy laittaa viittaamaan oikeaan artistiin, jolloin luodaan uusi rivi levy-tauluun ja muokataan vanhan rivin statusta:

        id artisti_id nimi muutettu status
        5 2 Best of 4.8.06 00:20 2
        6 1 Best of 4.8.06 00:25 1

        Lisäksi halutaan varmaankin tuo väärä "Madona" pois, joten muokataan lisäksi artisti-taulua (huom. uudenkin Madona-rivin status voi nyt olla 2 = poistettu, koska tätä riviä ei haluta enää näyttää missään muutenkaan; pitää vain varmistua siitä ettei ko. artisti-id-arvoon viitata erityisesti levy-taulun voimassaolevista riveistä; tässä tapauksessa uusi rivi artisti-tauluun ei edes ole tarpeen, vaan voidaan suoraan muokata status-kenttää):

        id nimi muutettu status
        1 Madonna 3.8.06 23:40 1
        2 Madona 4.8.06 00:15 2
        3 Madona 4.8.06 00:27 2

        Tämän jälkeen kannasta haetaan näkyviin aina vain yksi Madonna ja yksi Best of -levy tälle artistille.

        En väitä että tämä olisi helpoin ja paras tapa, mutta kunhan antaa edes jotain ideoita toteuttamiseen. :) Oleellista on se, että aina muokattaessa muokataan vanhaa status=1-riviä (mutta ei tämän nimi- eikä aikaleimakenttiä!) sekä luodaan uusi rivi muokatulle tiedolle, jossa status=1.

        Huomioi myös muutettu-kentän käyttö ja päivitys yhtenäisesti läpi kaikkien toimintojen; yllä en ole toimintojen yhteydessä siihen koskenut, vaan aina on luotu uusi rivi vaikkei se olisi välttämättä tarpeenkaan (ks. artisti-taulusta id-arvot 5 ja 6). Toki yo. artisti-taulun muokkaus jättää avoimeksi sen kysymyksen, _miten_ ja _miksi_ kyseinen uusi id (6) on tauluun ilmestynyt ts. virheellinen Madona ja tästä korjattu oikea Madonna eivät linkity toisiinsa mitenkään. Historiaan siis vain tallentuvat "toimintojen seuraukset", eivät tietoalkioiden väliset linkitykset.


      • tohlo

        > Toinen vaihtoehto on tehdä kullekin taululle oma backup-taulunsa, johon siirretään vanha
        > voimassaollut rivi sellaisenaan, ja varsinaisen käyttötaulun rivin arvoa sitten päivitetään
        > lisäämättä uusia rivejä ko. tauluun.

        Mietin tätä ja oikeastaan tämä alkaa kuulostaa paremmalta kuin noiden statuksien kanssa temppuilu, jota aiemmin ehdotin. Tämä backup-taulujen käyttö tuntuu yksinkertaisemmalta. Kun muutoksia halutaan tallentaa johonkin tauluun, kopioidaan ko. taulun kohderivi ensin backup-tauluun talteen, jonka jälkeen vasta varsinainen muokattu rivi tallennetaan entisen päälle alkuperäiseen tauluun. (Oma lukunsa on selvittää mitkä ovat kohderivejä taulussa, jos niitä ei olekaan tasan yksi.)

        Tietokannan taulujen lukumäärä toki tuplaantuu, mutta se ei liene ongelma. :)


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornosta

      https://www.kymensanomat.fi/paikalliset/8081054 Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornon hallussapi
      Kotka
      86
      2341
    2. Olen tosi outo....

      Päättelen palstajuttujen perusteella mitä mieltä minun kaipauksen kohde minusta on. Joskus kuvittelen tänne selkeitä tap
      Ikävä
      19
      2272
    3. Vanhalle ukon rähjälle

      Satutit mua niin paljon kun erottiin. Oletko todella niin itsekäs että kuvittelet että huolisin sut kaiken tapahtuneen
      Ikävä
      19
      1818
    4. Oletko sä luovuttanut

      Mun suhteeni
      Ikävä
      105
      1477
    5. Maisa on SALAKUVATTU huumepoliisinsa kanssa!

      https://www.seiska.fi/vain-seiskassa/ensimmainen-yhteiskuva-maisa-torpan-ja-poliisikullan-lahiorakkaus-roihuaa/1525663
      Kotimaiset julkkisjuorut
      76
      1472
    6. Hommaatko kinkkua jouluksi?

      Itse tein pakastimeen n. 3Kg:n murekkeen sienillä ja juustokuorrutuksella. Voihan se olla, että jonkun pienen, valmiin k
      Sinkut
      162
      1253
    7. Aatteleppa ite!

      Jos ei oltaisikaan nyt NATOssa, olisimme puolueettomana sivustakatsojia ja elelisimme tyytyväisenä rauhassa maassamme.
      Maailman menoa
      257
      1042
    8. Mitä sanoisit

      Ihastukselle, jos näkisitte?
      Tunteet
      68
      969
    9. Onko se ikä

      Alkanut haitata?
      Ikävä
      78
      919
    10. Omalääkäri hallituksen utopia?

      Suurissa kaupungeissa ja etelässä moinen onnistunee. Suuressa osassa Suomea on taas paljon keikkalääkäreitä. Mitenkäs ha
      Maailman menoa
      174
      903
    Aihe