![]() |
Hej!
Sitter och försöker strukturera upp ett system med olika användarrättigheter, men skisserna jag har tycker jag har blivit lite väl invecklade, med sql-frågor som börjar lika uppsatser! (Använder PHP & MySQL) Jag har ett system med olika användare samt hiraktiska objekt (Objekten är av olika typer). Objekt_typ1 | |-objekt_typ2 | --objekt_typ2 . | . |-objekt_typ3 . --objekt_typ3 För att bygga hirakin: objekt_typ2 och typ3 har varsin parent-fält i db:n för att ange objekt_typ1 respektive objekt_typ2. Nu utvecklar jag ha ett behörighetssystem som kan hantera, att man sätter olika behörigheter på olika objekt (Ex: Dold!) Egenskapen ska även ärvas neråt. (Om typ2 är dold så ska alla typ3-barnen vara lika så) En användare ska även kunna få rättighet att se ett specifikt objekt (Ex objekt_typ3,id=8) Ganska likt windows-filsystemsrättigheter med andra ord! Hur löser man dett på ett snyggt sätt i en databas? Någon som sett liknande? / Lasse Edit: Funderar även på att lägga hela hirakin i en table: id, parent, objekttyp, objektid om det underlättar! |
Citat:
Om du har denna struktur dock så bör du se till så att du inte får någon loop (1 -> 2 -> 3 -> 1 -> etc etc) men det kan du ju skippa om det är du själv som ska lägga upp strukturen. Vad behöver du hjälp med mer specifikt? Sql? |
Citat:
Tror jag kör på det! Citat:
Citat:
/ Lasse |
Citat:
som plockar ut hela trädet uppåt? Jag testade med följande något motsägelsefulla query: Kod:
SET @nextid=3; / Lasse |
Rättigheter kan göra på många olika sätt.
Ett sätt som blir lätt att administrera om du behöver ändra rättigheterna mera "globalt" är att se till så att en användare har en pekare mot en säkerhetsgrupp (lite som i windows...) sen så har du tex ett fält i säkerhetsgruppen där du anger endera en nivå som du själv hittar på (1,2,3,...). Eller så går du ner på detaljnivå per grupp och låter summan av alla rättigheter för enskilda rader vara det tal som du använder för att kolla behörighet. (shit, svårt att förklara). Kod:
|
Jag surfade runt och fick ihop en del idéer och löste problemmet!
Tänkte lite kort dela med mig av min lösning om nån som har funderat på samma sak! Jag skapade en trädtabell. Utöver parent_id angav jag även 3 till fält: Kod:
id parent_id level uppe nere Men en enda fråga kan man få ut precis den del av trädet man vill ha (Uppåt, neråt, djupbegränsning, sökväg etc) Men en subquery kan man även få saker till att ärvas, både uppåt och neråt: Följande plockar ut trädet från noden id=1 Även ett fält vid namn krav finns med, vilket ärvs neråt! (Med en OR-funktion) Kod:
"SELECT uppe, nere FROM t1 WHERE id =".$id Det finns väldigt mycket man kan trolla med detta, exempelvis så räknar följande column ut antalet barn: Kod:
CAST((tree.nere - tree.uppe - 1)/2 AS UNSIGNED) AS antal_barn så svåra att skriva! Detta löste MÅNGA av de problem jag har funderat över och förenklade massor! Tack för hjälpen, det gav mig en del tips och ideér! / Lasse |
Du kan alltid spara lite querytid genom att spara info om antalet barn på raden då denna ändras väldigt sällan.
Ändras sällan + många frågor = lagra i tabellen Ändras ofta + få frågor = räkna ut med sql |
Citat:
Jag håller på att testa systemet och har fyllt upp 12000 poster i trädet (Hoppas på att det ska klara mer..) Räkna ut antalet barn påverkar inte tiden nämvärt, utan kravarv är den tunga posten. Att plocka ut 100 poster kan ta upp mot 8 sekunder som det är just nu, så något måste göras! Så därför tänkte som jag Robert föreslår, spara kravarv som ett extra fält. (som cache) Frågan är nu, hur skriver man uppdateringen av detta fält? Försökte med: Kod:
SQL: Måste man köra det via en tillfällig tabell eller finns det någon annan lösning? Fråga 2 är, kan jag göra något för att snabba upp kravarv-queryn? Kod:
SELECT BIT_OR(krav) AS kravarv FROM t1 AS path WHERE path.uppe <= $uppe AND path.nere >= $nere) (Även testat på arv...) / Lasse |
Citat:
|
Alla tider är GMT +2. Klockan är nu 12:08. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson