Nyt sitten tuli mieleen toinen erittäin fiksu kysymys, johon tarvitsen hyvän ajatusmallin
-Miten sivustolle kehittäisitte käyttäjätasot, ajatuksena heittää MySQL-tietokantaan.
tarkoituksena olisi: ei lukua, luku, editointi, julkaisija, pääkäyttäjä
alaryhmiä olisi esim: uutiset, omat tiedot, työvuorot, yms..
Eli miten tuon saisi fiksusti ratkaistua php-koodiin? Lähinnä ajatusmalleja kaipailisin..
Itse ottaisin mallia MediaWikistä, jossa on userrights-niminen taulu, jossa on kaksi saraketta: käyttäjän tunnuksen ID ja perässä ryhmä. Esimerkkitapauksena vaikka käyttäjä 1, joka on jäseninä ryhmissä "bureaucrat" ja "sysop" ja käyttäjä 2, joka on jäsenenä vain ryhmässä "sysop"; näyttäisi tällaiselta:
user | group |
1 | bureaucrat |
1 | sysop |
2 | sysop |
Mikäli ryhmiä on hyvin vähän, voit tehdä jokaiselle oman sarakkeen, jonka arvoksi tulee joko 1 tai 0. Tapauksessa, jossa ryhmiä voidaan lisäillä tai poistella, kannattaa käyttää ensiksi mainittua.
Ei sitä varmaan tarvitse erillistä taulua tehdä sille. Riittää, että lisää sarakkeet käyttäjien tauluun. Esimerkkinä taulu voisi näyttää seuraavalta:
id | nimi | taso |
1 | Pekka | paakayttaja |
2 | Martti | none |
3 | Miisa | moderaattori |
Itselläni on tietokanta sivulla järjestetty siten, että ne jotka pääsevät sivuja muokkaamaan omaavat käyttäjätason 1. Muut saavat oletuksena arvon 0.
Itse taas tekisin useammankin taulun:
id | nimi |
---|---|
1 | Pekka |
2 | Liisa |
id | nimi |
---|---|
1 | uutiset |
2 | keskustelu |
kayttaja_id | oikeus_id |
---|---|
1 | 1 |
1 | 2 |
2 | 2 |
Nyt uutissivu voi tarkistaa oikeuden tähän tapaan:
SELECT kayttaja.id FROM kayttaja LEFT JOIN kayttaja_oikeus_map ON kayttaja_oikeus_map.kayttaja_id = kayttaja.id LEFT JOIN oikeus ON kayttaja_oikeus_map.oikeus_id = oikeus.id WHERE oikeus.nimi = 'uutiset' AND kayttaja.id = 2 -- kirjautuneen id
Rakenteen edut:
Rakenne on idealtaan sama kuin Juhkon mainitsema MediaWikin versio, mutta normalisointi on viety vielä pidemmälle. MediaWikin mallissa ryhmän nimessä on joko kirjoitusvirheriski (tekstikentällä) tai lukumäärärajoitus (enum- tai set-tyypillä). Toki peruskäytössä se 64 vaihtoehtoa yleensä riittää. :)
Macro kirjoitti:
Ei sitä varmaan tarvitse erillistä taulua tehdä sille.
Paitsi jos käyttäjä voi kuulua useampaan ryhmään samanaikaisesti.
Jokaisella käyttäjällä on oma taulukko jossa on linkit taulukkoihin käyttjän_oikeudet ja käyttäjän_ryhmät. Ja tietenkin on taulukko kaikista käyttäjistä.
Jokotai kirjoitti:
Jokaisella käyttäjällä on oma taulukko jossa on linkit taulukkoihin käyttjän_oikeudet ja käyttäjän_ryhmät.
Jokaisella käyttäjällä oma taulu(kko)?
Ei taida olla ihan tietokantojen optimaalista käyttöä....
Ei mutta pidän olioista ja monimutkaisista tiedosto rakenteista:)
Aihe on jo aika vanha, joten et voi enää vastata siihen.