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

463

    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. Ja taas ammuttu kokkolassa

      Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.
      Kokkola
      52
      5300
    2. Mitä siellä ABC on tapahtunut

      Tavallista isompi operaatio näkyy olevan kyseessä.
      Alajärvi
      81
      3920
    3. Helena Koivu on äiti

      Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.
      Kotimaiset julkkisjuorut
      325
      2305
    4. Milli-helenalla ongelmia

      Suomen virkavallan kanssa. Eipä ole ihme kun on etsintäkuullutettu jenkkilässäkin. Vähiin käy oleskelupaikat virottarell
      Kotimaiset julkkisjuorut
      267
      1932
    5. Kuinka kauan

      Olet ollut kaivattuusi ihastunut/rakastunut? Tajusitko tunteesi heti, vai syventyivätkö ne hitaasti?
      Ikävä
      117
      1798
    6. Kun näen sinut

      tulen iloiseksi. Tuskin uskallan katsoa sinua, herätät minussa niin paljon tunteita. En tunne sinua hyvin, mutta jotain
      Ikävä
      56
      1382
    7. Ja taas kerran hallinto-oikeus että pieleen meni

      Hallinto-oikeus kumosi kunnanhallituksen päätöksen vuokratalojen pääomituksesta. https://sysmad10.oncloudos.com/cgi/DREQ
      Sysmä
      95
      1290
    8. Yhdelle miehelle

      Mä kaipaan sua niin paljon. Miksi sä oot tommonen pösilö?
      Ikävä
      70
      1232
    9. Löydänköhän koskaan

      Sunlaista herkkää tunteellista joka jumaloi mua. Tuskin. Siksi harmittaa että asiat meni näin 🥲
      Ikävä
      133
      1197
    10. Purra saksii taas. Hän on mielipuuhassaan.

      Nyt hän leikkaa hyvinvointialueiltamme kymmeniä miljoonia. Sotea romutetaan tylysti. Terveydenhoitoamme kurjistetaan. ht
      Maailman menoa
      295
      1172
    Aihe