Tietokannan käyttöön liittyvä kysymys

Viestiketju alueella 'Ohjelmointi' , aloittaja grimmari, 30.09.2018.

  1. grimmari

    Rekisteröitynyt:
    30.09.2018
    Viestejä:
    3
    Moron!

    Eli minulla on käyttäjän id jonka perusteella haen tiedon onko käyttäjällä jokin kortti vai ei.

    Kortteja on noin 60 kpl
    Jokaisella käyttäjällä voi olla eri kortiteja

    eli teenko taulun jossa on kortti=sarake ja tallennan arvon tosi/epätosi ja tietty käyttäjän id:n jolloin yhdellä rivillä on tiedot kaikista korteista. Eli tällöin listaan kaikki kortit ja jokaista korttia kohden tallennetaan onko korttia vai ei.

    Toinen vaihtoehto on tallentaa tauluun käyttäjän id ja kortin id riviksi jolloin tulisi alikysely jolla haen ko.kortin nimen. tällöin tallentaisi kuin ne kortit joita on.
    Tällöinhan samaan tauluun tulee useampia rivejä joissa saman käyttäjään kohdistuvia tietoja voi olla.


    Eli vielä toisinpäin:
    Onko parempi tapa hakea yksi id ja lukea saadulta riviltä kaikkien korttien tiedot (tällöin sarakkeita tulee yhtä monta kuin on korttia)
    vai
    tallentaa tiedot "pareina" ja hakea kyselylä, tällöinhän joutuu käymään koko taulun läpi...?


    käytän mysql:ää

    Ari
     
  2. Paapaa

    Rekisteröitynyt:
    14.04.2005
    Viestejä:
    11 011
    Tuo on many-to-many -relaatio, joten yksi tapa on luoda 4 taulua. users-taulussa käyttäjien tiedot. cards-taulussa keikki erilaiset kortit. Ja decks-taulussa on rivejä, joissa on sekä user_id että card_id, joka siis linkittää käyttäjän ja kortin. Lisäksi haluat yhdistää dekit tiettyyn peliin (games-taulu), jotta voit tarkistaa että tiettyä korttia ei ole liian monella pelaajalla tms. Voit decks-tauluun luultavasti luoda komposiittiavaimen (card_id, game_id) jonka pitää olla uniikki. Eli tietty kortti voi olla vain yhdellä pelaajalla pelissä.

    Tuo on hyvin peruskauraa tietokannoille, joten suorituskykyä tuskin tarvitsee miettiä.
     
  3. grimmari

    Rekisteröitynyt:
    30.09.2018
    Viestejä:
    3

    Joo siis kysymys ei ole pelistää vaan nettiportaalista jossa käyttän kortit tallennetaan kantaan ja käytetään sitten hauissa.
    Mutta joo, teen kyselyillä ja relaatiolla -- vaikka helppoahan se olisi tehdä tuollai yhden taulun avullakin - Tosin nimenomaan mietitytti vaan tuo taulun sarakkeiden määrä.
    Kun luen tiedot niin joudun kuitenkin parsimaan tiedon frontendissä.... eli joudun esittämään myös että mitä kortteja ei ole... (checkbox) arvoilla
     
    Viimeksi muokattu: 30.09.2018
  4. Grez

    Rekisteröitynyt:
    30.04.2001
    Viestejä:
    5 695
    Tyypillisesti tietokannoissa ja niiden relaatioissa on olennaiset luvut 0, 1 tai n. Eli jos kortteja on 60, niin silloin niiitä on n. Ei tehdä käyttäjätauluun 60 saraketta vaan erillinen sidostaulu.

    Hyvin suunnitellussa tietokannassa ei koskaan ole 60 tai edes 10 samanlaista asiaa kuvaavaa saraketta.

    Ei joudu, miksi joutuisi? Ja jos joutuu, niin sittenhän yhtä lailla tuossa toisessakin vaihtoehdossa joutuu "käymään koko taulun läpi".
     
  5. MoonCow

    Rekisteröitynyt:
    20.08.1999
    Viestejä:
    706
    Olettaen että käytössä on relaatiokanta, niin silloin tehdään juuri niin kuin käyttäjä Grez sanoi. Toisin sanoen toteutat 3 taulua, joista yhdessä on käyttäjät, toisessa kortit ja kolmannessa mitkä kortit kuuluvat tietylle käyttäjälle. Taulujen rakenne voisi olla esimerkiksi:

    Koodi:
    users
    | id | username |
    -------------------
    | 1  | foo          |
    -------------------
    
    cards
    | id | card |
    -------------
    | 1  | lohis |
    | 2  | kunkku |
    ----------------
    
    deck
    | id | user_id | card_id |
    ---------------------------
    | 1 |  1          | 2         |
    ---------------------------
    Tässä tilanteessa voit helposti hakea käyttäjän ja kaikki käyttäjän omistamat kortit yhdellä kyselyllä. Käyttäjällä foo on siis yksi kortti: `kunkku`
     
  6. croci

    Rekisteröitynyt:
    18.01.2001
    Viestejä:
    690

    Pelkästään normalisointi sääntöjen mukaan jaettavissa oleva tieto täytyy jakaa, eli ei todellakaan tehdä yhdellä taululla.
     
  7. siperiankuu

    Rekisteröitynyt:
    13.12.2016
    Viestejä:
    524
    Sokean dogmatiikan sijaan kannattaa miettiä, mikä on tiedon suhde muuhun tietokantaan. Jos kortteihin ei tarvitse viitata muista tauluista tai edes saman taulun sisällä, niin aika suoraviivaista olisi tallettaa ne yhteen sarakkeeseen käyttäen taulukkotyyppiä. (Riippuu tietokantamoottorista ja omista tarpeista, mitä vaihtoehtoja tyypin valinnalle on.) On aika turhaa tehdä uutta taulua siinä tapauksessa, että sarakkeina sillä on vain vierasavain päätauluun ja atominen kortin arvo.
     
    Viimeksi muokattu: 17.11.2018
Tagit:

Jaa tämä sivu

Alibi
Anna
Deko
Dome
Erä
Hymy
Kaksplus
Kippari
Kotilääkäri
Kotiliesi
Koululainen
Ruoka.fi
Parnasso
Seura
Suomen Kuvalehti
TM Rakennusmaailma
Tekniikan Maailma
Vauhdin Maailma
Golfpiste
Vene
Nettiauto
Ampparit
Plaza
Muropaketti