Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
22.10.2009 08:57:27
mysqli optimiseerimine |
|
|
on 2 tabelit v2ljadega
tabel 1 users:
user_id
user_name
tabel 2 admins:
user_id
php:
|
$query = "select user_id, user_name from %s order by user_name"; $result = $db->squery($query, DB_USERS) or sql_error(__FILE__, __LINE__); $i = 0; while($user = $db->assoc($result)) { $users["$i"] = $user; $aq = "select count(user_id) as count from %s where user_id='%s'"; $ar = $db->squery($aq, DB_ADMINS, $user['user_id']) or sql_error(__FILE__, __LINE__); $count = $db->assoc($ar); if($count['count'] == 1) $users["$i"]['admin'] = $user['user_id']; $i++; }
|
vaja siis välja võta kõik kasutajad ning juhul kui kasutaja on ka admin, siis see info kah lisada
see minu script töötab küll, kuid kas seda kuidagi ainult mysqliga ei saaks pärida?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
606
HV vaatleja
liitunud: 04.02.2004
|
22.10.2009 09:49:37
|
|
|
miks Sul admin ja user eraldi tabelites üldse on?
miks mitte teha tabel USERS ja RIGHTS
USERS:
user_id
username
rights
RIGHTS:
right_id
r_name (määrad ära, kas tavakasutaja - user, admin jne, saad alati ja lihtsalt uusi õiguste gruppe juurde teha)
lisaks on kõik kasutajad olenemata õigustest samas tabelis.
|
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004

|
22.10.2009 11:57:33
|
|
|
Või siis tekitada vastavad tulbad õiguste tabelisse et kas on admin, mingi muu tase jne.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
606
HV vaatleja
liitunud: 04.02.2004
|
22.10.2009 12:23:12
|
|
|
mikk36 kirjutas: |
Või siis tekitada vastavad tulbad õiguste tabelisse et kas on admin, mingi muu tase jne. |
eraldi tulpasid ei ole mõtet küll baasi õiguste jaoks teha, iga uue õiguse korral peab siis ju tabeli struktuuri muutma.
asi läheb segaseks, kui vaja kasutada 10+ erinevat õigust. (olenevalt baasist tähendab baasi tabeli struktuuri muutus tabeli lukustamist, ehk sel hetkel ei saa keegi tabelit lugeda, minu näite puhul saab aga uusi õiguste gruppe jooksvalt lisada.
|
|
tagasi üles |
|
 |
wk
HV vaatleja
liitunud: 22.05.2007
|
22.10.2009 12:43:53
|
|
|
606 kirjutas: |
eraldi tulpasid ei ole mõtet küll baasi õiguste jaoks teha, iga uue õiguse korral peab siis ju tabeli struktuuri muutma. |
Mispärast? Selleks on välja mõeldud näiteks bitid: 1 - võib lugeda 2- võib muuta 4 - võib luua 8 - võib lamiseda 16 - võib ... Ja siis summeerid õigused ja ongi selge. Sama asja võid teha ka algarvudega, siis korrutad kokku.
_________________ Kõike hääd,
WK |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
22.10.2009 12:56:12
|
|
|
Kindlasti on vale teha kasutajate tabelisse iga privileegi kohta eraldi tulp.
Täpselt sama vale kasutajate tabelis veerg RIGHTS. Mis siis teed, kui kasutajale vaja liita rohkem, kui 1 privileeg?
Ei tea süstemi keerukust aga vähegi keerulisemal juhul on mõistlik teha järgmiselt:
Tabelid:
USERS - sisaldab kasutajaid
RIGHTS - sisaldab funktsionaalseid privileegidega (kasutaja näeb menüüpunkti X, saab otsida isikut jne)
ROLES - sisaldab töökorralduslikult paika pandud "töökohti" (müügisekretär, laohoidja jne)
nüüd teed lisaks seosetabelid:
ROLES_RIGHTS - siin seod vastava töökoha õigused vastavate privileegidega
USERS_RIGHTS - saad siduda kasutaja konkreetse funktsionaalse õigusega (see on pigem erandkorras kasutamiseks)
USERS_ROLES - siin annad konkreetsele kasutajale konkreetse töökoha õigused.
Mis puutub konkreetsesse päringusse, siis mysql pole kasutanud aga võtmesõnaks võiks olla näiteks (OUTER) JOIN.
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
wk
HV vaatleja
liitunud: 22.05.2007
|
22.10.2009 13:25:25
|
|
|
2korda2 kirjutas: |
Kindlasti on vale teha kasutajate tabelisse iga privileegi kohta eraldi tulp.
|
Kindlasti on vale öelda, et miski on kindlasti vale ;)
2korda2 kirjutas: |
Täpselt sama vale kasutajate tabelis veerg RIGHTS. Mis siis teed, kui kasutajale vaja liita rohkem, kui 1 privileeg?
|
Teen lihtsalt nii, nagu eelmises postituses selgitasin. Ühest veerust piisab.
_________________ Kõike hääd,
WK |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
22.10.2009 14:12:18
|
|
|
Või siis vahepealse variandina võimalus jätta rollimajandus kõrvale ja tekitada lihtsalt USERS, RIGHTS ja USERS_RIGHTS tabelid.. Kui kogu kasutaja õiguste pärimise osa koodis ühtekohta kokku koondada, ei ole kuigi keeruline hiljem vajaduse tekkimisel ka rolle juurde lisada.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
606
HV vaatleja
liitunud: 04.02.2004
|
22.10.2009 14:24:41
|
|
|
täielikult nõus 2korda2'ga, kui on vaja mitu erinevat õigust lubada. lihtsa funktsionaalsuse puhul piisab 2'st tabelist.
|
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
22.10.2009 14:38:41
|
|
|
OK, aga pöördume nüüd minu küsimuse juurde tagasi. kas seda minu koodi optimiseerida saab ilma tabeleid muutmata?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
22.10.2009 14:47:56
|
|
|
Nagu öeldi, märgusõna on JOIN. Antud juhul siis umbes:
SELECT u.user_id, u.user_name, CASE a.user_id WHEN NULL THEN 0 ELSE 1 END CASE AS is_admin FROM users u LEFT JOIN admins a ON (u.user_id = a.user_id) ORDER BY u.user_name
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
23.10.2009 09:52:11
|
|
|
select cms_users.user_id, cms_users.user_name, case cms_admins.user_id when null then 0 else 1 end case as is_admin from cms_users left join cms_admins on (cms_users.user_id = cms_admins.user_id) order by cms_users.user_name |
ma ei saa sellega ikka hakkama. mis mul siin valesti on? ja kas ikka associga peaks välja võtma?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
23.10.2009 11:13:57
|
|
|
Üks viga minul endal:
CASE a.user_id WHEN NULL THEN 0 ELSE 1 END CASE
asemel peaks olema:
CASE WHEN a.user_id IS NULL THEN 0 ELSE 1 END CASE
Aga mis ta muidu teeb sul? Annab veateadet? Töötab, aga valesti?
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
23.10.2009 11:32:02
|
|
|
select u.user_id, u.user_name,
case
when a.user_id is NULL then '0' else '1'
end as is_admin
from cms_users as u left join cms_admins as a on (u.user_id = a.user_id)
order by u.user_name |
selline on õige
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
23.10.2009 11:43:00
|
|
|
aga mis vahet on näiteks inner join, left join jne
ja huvitav kuidas sellesse päringusse veel kolmas tabel kaasata?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
23.10.2009 11:56:06
|
|
|
Kui sa joinid tabelit B tabeli A külge tingimusel X:
- (INNER) JOIN tagastab ainult sellised read, kus tingimus X on täidetud
- LEFT (OUTER) JOIN tagastab kõik read tabelist A ja ühendab neile külge B, kus tingimus X on täidetud
- RIGHT (OUTER) JOIN tagastab kõik read tabelist B ja ühendab neile külge A, kus tingimus X on täidetud
- FULL (OUTER) JOIN tagastab kõik read tabelist A ja tabelist B ja ühendab omavahel need read, kus tingimus X on täidetud (enda praktikas läheb väga harva vaja seda)
INNER ja OUTER ei ole JOINide nimedes olulised, võid ära jätta ja kasutada LEFT OUTER JOIN asemel lihtsalt LEFT JOIN jne.
Vaata joonised mõttega läbi ja katseta oma andmetega:
http://www.codinghorror.com/blog/archives/000976.html
Kolmanda tabeli saad samamoodi külge nagu teisegi said: sobiv JOIN ja tingimused, millega teda külge võtta.
viimati muutis mrkaarel 23.10.2009 12:00:54, muudetud 1 kord |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
23.10.2009 11:57:41
|
|
|
wk kirjutas: |
2korda2 kirjutas: |
Täpselt sama vale kasutajate tabelis veerg RIGHTS. Mis siis teed, kui kasutajale vaja liita rohkem, kui 1 privileeg?
|
Teen lihtsalt nii, nagu eelmises postituses selgitasin. Ühest veerust piisab. |
Ma teen praegu süsteemi, kus hetkeseisuga on 171 privileegi. Näiteks kasutajate privileegide auditit on kindlasti väga mõnus selle "1 veeru meetod" abil teha.
Sellised lahendused võivad töötada süsteemis, kus on kuni 5 kasutajaõigust. Kui vähegi keerulisem lahendus, siis varem või hiljem oled upakil.
Minu poolt pakutud lahendus on väga lihtne, selge ja töötab.
keevitaja,
kohe kõige esimene google päring "join in sql" annab selle:
http://www.w3schools.com/Sql/sql_join.asp
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
23.10.2009 15:29:00
|
|
|
2korda2 kirjutas: |
Sellised lahendused võivad töötada süsteemis, kus on kuni 5 kasutajaõigust. |
Selliseid süsteeme on kusjuures täiesti arvestatav hulk. Kõhutunde järgi pakuks, et isegi rohkem, kui selliseid süsteeme, kus on üle 5 kasutajaõiguse:)
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
wk
HV vaatleja
liitunud: 22.05.2007
|
23.10.2009 16:59:59
|
|
|
2korda2 kirjutas: |
Ma teen praegu süsteemi, kus hetkeseisuga on 171 privileegi. Näiteks kasutajate privileegide auditit on kindlasti väga mõnus selle "1 veeru meetod" abil teha |
Sinu vajadused saab katta 171 bitiga kasutaja kohta, Ka nende õiguste kontrollimine on sel juhul väga lihtne, iga positsiooni bitt räägib õiguse olemasolust või puudumisest.
Ja see skaleerub praktiliselt lõpmatusse, uute õiguste lisamisel pole vaja tabelis midagi muuta. Sellises mahus õiguste majandamist ei tee kuidagi kergemaks eraldi tabel, kus on 171 veergu. Igaljuhul tuleb ehitada selle pääle korralik liides.
_________________ Kõike hääd,
WK |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
nn3_
HV kasutaja

liitunud: 13.09.2003
|
23.10.2009 17:42:37
|
|
|
606 kirjutas: |
:) täielikult nõus 2korda2'ga, kui on vaja mitu erinevat õigust lubada. lihtsa funktsionaalsuse puhul piisab 2'st tabelist. |
Lihtsa funktsionaalsuse puhul piisab täiesti 1 tabelist nagu wk seletas.
1 - esimene tegevuse õigus, 2 - teise tegevuse õigus, 4 - kolmanda tegevuse õigus jne.
Kui tahad mitut õigust määrata, siis liidad kokku... näit esimene pluss kolmas õigus on 5.
Mingi õiguse sisaldumist võid otse SQL WHERE lauses kontrollida bitwise and-iga (WHERE rights & 4)
http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html
Kes siin rääkis 171 eri privileegi (tegevuse või taseme ilma seosteta kui sellise) olemasolust, siis pead ei anna, aga mul on tunne et tegu on mööda rääkimisega või ülekomplitseeritud näitega või midagi arhitektuuriliselt väga valesti.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
23.10.2009 18:09:16
|
|
|
wk kirjutas: |
tabel, kus on 171 veergu |
2korda2 poolt pakutud lahenduses ei suurene õiguste lisamisel üheski tabelis veergude, vaid ainult ridade arv. Sellise lahenduse plussid on, et on võimalik andmebaasi tasemel foreign key'dega tagada andmete terviklikkus ja samuti saada ka puhtalt andmebaasi poolelt hea ülevaade kasutajate õigustest. Sellise õiguste hulga juures täiesti arukas lahendus, samas väikse ja piiratud hulga õiguste korral ilmselt rohkem koodi vaeva kui minimaalselt vaja.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
wk
HV vaatleja
liitunud: 22.05.2007
|
23.10.2009 18:12:31
|
|
|
mrkaarel kirjutas: |
wk kirjutas: |
tabel, kus on 171 veergu |
2korda2 poolt pakutud lahenduses ei suurene õiguste lisamisel üheski tabelis veergude, vaid ainult ridade arv. |
Vabandust, minu viga. Just tema ei soovitanud lisaveerge. Minu lahendusega on võimalik vältida risttabelit, aga õigused tuleks ikka defineerida eraldi tabelis koos bitmaskiga.
_________________ Kõike hääd,
WK |
|
Kommentaarid: 8 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
24.10.2009 16:02:17
|
|
|
nüüd veel üks päring. kas seda saaks kah optimiseerida? vaja siis kustutada erinevatest tabelitest kirjed, millel igas on üks ja sama page_id
$page_id = 7;
$tables = array(DB_PAGES, DB_PAGE, DB_ACTIVE_PAGES);
$query = "delete from %s where page_id='%s'";
for($i = 0;$i < count($tables);$i++)
$db->squery($query, $tables["$i"], $page_id) or sql_error(__FILE__, __LINE__); |
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks!
viimati muutis keevitaja 24.10.2009 23:02:59, muudetud 2 korda |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
 |
mrkaarel
HV vaatleja
liitunud: 08.07.2008
|
24.10.2009 16:11:50
|
|
|
Kui antud olukord on selline, kus kustutatakse nii põhikirje kui ka sellele viitavad kirjed, siis sa saaks foreign key'de juures määrata ära cascade võimaluse ja põhikirje kustutamisel kustutab andmebaasimootor kõik sellele viitavad kirjed automaatselt. Kui olukord selline pole, siis koodi pealt ma ei näe küll, kuidas praegust lahendust optimeerida.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
24.10.2009 18:07:15
|
|
|
/offtopic
nn3_ kirjutas: |
Kes siin rääkis 171 eri privileegi (tegevuse või taseme ilma seosteta kui sellise) olemasolust, siis pead ei anna, aga mul on tunne et tegu on mööda rääkimisega või ülekomplitseeritud näitega või midagi arhitektuuriliselt väga valesti. |
Ma võtaks hea meelega mõne pea panti
Kahjuks pole hetkel võimalik kontrollida, kui palju oli privileege eelmises süsteemis, mida tegin aga hetkel pakuks, et pigem rohkemgi. Ei ole tegemist möödarääkimisega - tegemist ongi suurte ja keeruliste süsteemidega (arendusmahud - palju miljoneid). Mõlemas töötavad õiguste süsteemid ülalkirjeldatud moel.
Kui kord on õiguste süsteem ära tehtud, siis on see universaalne lahendus äärmiselt lihtsalt taaskasutatav - pole mõtet iga kord uuesti nullist alata. Sisuliselt uue projekti alustuseks käima lasta pakett create_database ja sellega kaasneb koheselt terve hulga sedasorti tabelite loomine. Sama ka programmi koodiga - kasutaja privileegide osa on üsna lihtsalt taaskasutatav.
offtopic/
Teemast,
keevitaja - ega ole tegemist koolitööga? Küsimus JOIN olemuse kohta võiks tulla esimest korda SQL-i kirjutaja poolt. Kes juba midagi loob, peaks selle väga olulise võttega ammu tuttav olema.
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
|