webForumDet fria alternativet

Kört fast i databasträsket

Webbutveckling

20 svar · 521 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Jag kanske har fel databasstruktur men jag tycker att denna känn lite "roddig". Finns kanske ett smartare sätt?!

	Set RecSet = Connect.Execute("SELECT ua_add, ua_addurl FROM user_addons WHERE ua_uid="& uid)
	If NOT RecSet.EOF Then
		Do while not RecSet.EOF
			if color="white" then color="gray" else color="white"
		
			Response.write "<tr class="& color &"><td>"& RecSet(0) &"&nbsp:</td><td>"
				Set RecSet2 = Connect.Execute("SELECT ur_"& RecSet(1) &" FROM user_restrictions WHERE ur_id="& id)
				Response.write RecSet2(0)
				Response.write "</td></tr>"& vbCrLf
		
		RecSet.movenext
		loop
	end if
Medlem sedan dec. 200012 464 inlägg
#2

Du har absolut fel datamodell.

Medlem sedan nov. 20017 144 inlägg
#3

Jaha det var det jag tänkte.
Då kanske inlägget kan flyttas till rätt forum.
Min tanke är att olika medlemmar/administratörer i ett community skall kunna administrera olika "avdelningar". Skulle behöva en liten puff i rätt riktning, tips?
Ex

[b]tabellen användare[/b]
id | namn |
------------------------
1  | Olle  |
2  | Pelle |
3  | Jöns  |

[b]tabellen rättigheter[/b]
id | avdelning
------------------------
1  | forum
1  | nyhetsbrev
2  | nyheter
3  | medlemmar/rättigheter

(Har man rättigheter att administrera "medlemmar" så skall man även kunna sätta olika rättigheter på andra medlemmar)
Medlem sedan juli 200012 978 inlägg
#4

Om du utgår från att en användare har en roll så har han den under en viss tidsrymd och den är då förknippad med olika rättigheter.
Ofta glöms tiden dvs from tom ett visst datum. Tänk så i rioller så ordnar det sig.
Om det är felstavatr så beror det på att Rikard beställde in många öl ikväll.

Medlem sedan nov. 20017 144 inlägg
#5

Que? :q

Medlem sedan dec. 20003 563 inlägg
#6

Gör en tredje tabell som kopplar ihop användarna med rättigheterna.

Medlem sedan nov. 20017 144 inlägg
#7

Men det gör jag ju i tabellen rättigheter.
Olle (1) har rätt till att administrera forum och nyhetsbrev.

Medlem sedan dec. 20003 563 inlägg
#8

Jag tycker du ska köra på

[b]tabellen användare[/b]
id | namn
1  | Olle
2  | Kajsa

[b]tabellen rättigheter[/b]
id | rättighet
1  | forum
2  | användare
3  | nyheter

[b]tabellen användarättigheter[/b]
userID | rättighet
2  | 1
2  | 2
2  | 3
1  | 3

I detta fall har Kajsa alla rättigheter medans Olle bara får administrera nyheter.

Medlem sedan juli 200012 978 inlägg
#9

Om man dessutom kompletterar den tredje tabellen med datum intervall från och med till till och med.
Så kan man se när förändringar i rättighetsdelen har förändrats.
Det är viktigt att ta med datum(TS) på transaktionsrättigheter.

Medlem sedan nov. 20017 144 inlägg
#10

Ok, du menar så. Ja det kanske är bra ja.
Men hur skulle man kunna göra en liknande grej som grundinlägget handlade om då?
Alltså, lista alla rättigheter forum, anvädare, nyheter osv
och sedan markera ut vilka rättigheter ex. Olle har?

Medlem sedan dec. 20003 563 inlägg
#11

Du hittar f.ö. nog på bättre namn för tabellerna och kolumnerna. ;)

' Alla rättigheter Olle har
SELECT t2.rättighet
FROM användarättigheter t1, rättigheter t2
WHERE t2.id = t1.rättighet
AND t1.userID = 1 (userid för Olle)

' Lista alla rättigheter
SELECT rättigheter FROM rättigheter
Medlem sedan nov. 20017 144 inlägg
#12

Lasp: Bra aspekt, skall ta med den i beräkningarna.
cyprys: Bra, jag skall labba lite.
Återkommer säkerligen.

Medlem sedan nov. 20017 144 inlägg
#13

cyprys skrev:

Du hittar f.ö. nog på bättre namn för tabellerna och kolumnerna. ;)

' Alla rättigheter Olle har
SELECT t2.rättighet
FROM användarättigheter t1, rättigheter t2
WHERE t2.id = t1.rättighet
AND t1.userID = 1 (userid för Olle)

' Lista alla rättigheter
SELECT rättigheter FROM rättigheter

Fast tanken var ju att man skulle nästla in det hela så att det blir så här ungefär:

[b]Användarrättigheter för Kajsa:[/b]

Forum       |  True
Nyheter     |  False
Nyhetsbrev  |  True
Medlemmar   |  False
Omrästning  |  False
Medlem sedan dec. 20003 563 inlägg
#14

Men det blir ju så egentligen. Säg att du tar fram alla id för rättigheter som Kajsa har och lägger in dem i t.ex. en array.
Den array får då värderna {1, 2, 3, 4} t.ex.

Sedan loopar du igenom alla rättigheter som finns.
För varje loop jämför du om värdet för rättigheten finns i din array. Det är ett enkelt och inte allt för långsamt sätt.

Du skulle även kunna räkna på alla rättigheter och köra en SQL-sats som räknar hur många poster det finns där Kajsa har just den rättigheten. (0 eller 1 alltså)
Den SQL-satsen överlåter jag till LarsG. ;)
Men den borde inte alls vara så avancerad. LEFT OUTER JOIN mellan rättigheter och användarrättigheter ungefär.

Medlem sedan nov. 20017 144 inlägg
#15

Ja, just ja.
Man skulle kunna räkna förekomsten av personens id i tabellen "användarättigheter" och köra en if-sats om siffran är högre än 0.
En annan variant är kanske att ta med en case-sats direkt i sql:en. Men det verkar ju vara hysteriskt svårt att formulera en sådan. Typ:

select id, case when speciellt_id is null then 'False' else 'True' end FROM tbl_rättigheter LEFT JOIN tbl_användarättigheter ON bla. bla. bla.
Medlem sedan nov. 20017 144 inlägg
#16

Nix, jag får inte till det.

Medlem sedan dec. 200012 464 inlägg
#17

Flyttas från ASP

Medlem sedan nov. 20017 144 inlägg
#18

Usch, svårt som attan.(för den som inte kan) Jag skulle vilja presentera resultatet så här:

[b]Användarrättigheter för Kajsa:[/b]

Forum       |  True | 2003-01-01 | 2006-01-10
Nyheter     |  False | 2003-01-01 | 2006-02-11
Nyhetsbrev  |  True | 2003-01-01 | 2006-04-10
Medlemmar   |  False | 2003-01-01 | 2006-06-15
Omrästning  |  False | 2003-01-01 | 2006-02-10

Men nu så listas det på alla andra sätt än detta.
Och sql:en ser ut så här:

SELECT ua_add,ual_fromdate,ual_todate, case when ual_umid = "& id &"  then 'checked' end FROM user_addons LEFT JOIN user_accesslevels ON ual_uaid = ua_id AND ua_uid="& uid &" ORDER BY ua_add
Medlem sedan nov. 20017 144 inlägg
#19

Tips?

Medlem sedan juni 20019 024 inlägg
#20

Jag föreslår denna datamodell i stället (som är väl beprövad & funkis):

En liknande tabell som du har nu, med användare:

[b]users[/b]
-----
userid
username

Roller (eller "grupp" om man föredrar det uttrycket) som användarna kan tillhöra, exempelvis "admin", "nyhetsskribent" och dylikt:

[b]roles[/b]
-----
roleid
roledescription

De olika rättigheterna, exempelvis "lägga till nyheter", "ta bort nyheter", "visa nyheter" etc:

[b]permissions[/b]
-----------
permissionid
permissiondescription

Du behöver också två "jointabeller" där rättigheter/användare/roller paras ihop.

Denna tabell tilldelar användare till ett valfritt antal roller:

[b]userroles[/b]
---------
roleid
userid

Denna tabell tilldelar rättigheter till rollerna:

[b]rolepermissions[/b]
---------------
roleid
permissionid

Det är en mycket flexibel design och tillåter att varje användare kan kopplas till en eller flera roller. Varje roll kan ha en eller flera rättigheter. Dessutom kan du lägga till och ta bort rättigheter utan att ändra databasdesignen, vilket är en av de viktigaste egenskaperna. Just nu lägger du bara till en rättighet och tilldelar den till valda roller.

265 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)