Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  mysqli optimiseerimine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 22.10.2009 08:57:27 mysqli optimiseerimine vasta tsitaadiga

on 2 tabelit v2ljadega

tabel 1 users:
user_id
user_name

tabel 2 admins:
user_id

php:
  1. $query = "select user_id, user_name from %s order by user_name";
  2. $result = $db->squery($query, DB_USERS) or sql_error(__FILE__, __LINE__);
  3.  
  4. $i = 0;
  5. while($user = $db->assoc($result))
  6. {
  7.         $users["$i"] = $user;
  8.        
  9.         $aq = "select count(user_id) as count from %s where user_id='%s'";
  10.         $ar = $db->squery($aq, DB_ADMINS, $user['user_id']) or sql_error(__FILE__, __LINE__);
  11.         $count = $db->assoc($ar);
  12.        
  13.         if($count['count'] == 1)
  14.                 $users["$i"]['admin'] = $user['user_id'];
  15.                
  16.         $i++;
  17. }


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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
606
HV vaatleja

liitunud: 04.02.2004




sõnum 22.10.2009 09:49:37 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online

sõnum 22.10.2009 11:57:33 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
606
HV vaatleja

liitunud: 04.02.2004




sõnum 22.10.2009 12:23:12 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
wk
HV vaatleja

liitunud: 22.05.2007




sõnum 22.10.2009 12:43:53 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 22.10.2009 12:56:12 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
wk
HV vaatleja

liitunud: 22.05.2007




sõnum 22.10.2009 13:25:25 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 22.10.2009 14:12:18 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
606
HV vaatleja

liitunud: 04.02.2004




sõnum 22.10.2009 14:24:41 vasta tsitaadiga

icon_smile.gif täielikult nõus 2korda2'ga, kui on vaja mitu erinevat õigust lubada. lihtsa funktsionaalsuse puhul piisab 2'st tabelist.
tagasi üles
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 22.10.2009 14:38:41 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 22.10.2009 14:47:56 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 23.10.2009 09:52:11 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 23.10.2009 11:13:57 vasta tsitaadiga

Ü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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 23.10.2009 11:32:02 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 23.10.2009 11:43:00 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 23.10.2009 11:56:06 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 23.10.2009 11:57:41 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 23.10.2009 15:29:00 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
wk
HV vaatleja

liitunud: 22.05.2007




sõnum 23.10.2009 16:59:59 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nn3_
HV kasutaja
nn3_

liitunud: 13.09.2003




sõnum 23.10.2009 17:42:37 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 23.10.2009 18:09:16 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
wk
HV vaatleja

liitunud: 22.05.2007




sõnum 23.10.2009 18:12:31 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 24.10.2009 16:02:17 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mrkaarel
HV vaatleja

liitunud: 08.07.2008




sõnum 24.10.2009 16:11:50 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 24.10.2009 18:07:15 vasta tsitaadiga

/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 icon_smile.gif
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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  mysqli optimiseerimine mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.