webForumDet fria alternativet

Påverka alla medlemmar

Databaser & SQL

3 svar · 282 visningar · startad av mozilla

Medlem sedan juli 20011 084 inlägg
Frågan#1

Jag har en liten fundering över hur man bäst påverkar alla medlemmar. Låt oss säg att jag har en form av kalender där medlemmar kan lägga till egna privata händelser på olika dagar. Jag vill sedan som administratör lägg in en aktivitet som visas för alla medlemmar. Hur bör man lösa det? (obs. det är inga färdiga kodexempel jag behöver, utan diskussioner angående själva tankesättet bakom)

Låt oss säga att databasstrukturen ser ut så här

id
user_id
date

Jag ser två möjliga lösningar,

1) Man skapar en aktivitet med user_id 0 och hämtar alla aktiviteter som antingen har rätt user_id eller user_id=0
Fördel, det blir mindre inlägg i databasen. Nackdel att det inte blir så flexibelt.

2) Jag loopar igenom alla medlemmar och lägger på ett inlägg på varje person.
Fördelen är att det blir större valfrihet, om jag i framtiden vill lägga på aktiviteter på nästan alla medlemmar går det också. Nackdelen är att det blir väldigt många inlägg i databasen för en aktivitet.

Jag vill även att aktiviteterna bara ska beröra de medlemmar som är registrerade för tillfället. Dvs. blir man registrerad dagen efter så skall man inte påverkas. Vilket fungerar bra med metod 2, och 1:an kräver en extra kontroll för det.

Vad anser ni? Vilken metod brukar ni använda? Eller använder ni en 3:e som jag inte har med? Jag har själv ofta använt metod ett, men jag gillar metod 2 mer pga. flexibiliteten.

Medlem sedan dec. 19995 874 inlägg
#2
  1. En metod är att ha en tabell med administratörsmeddelanden. Du har en extra kolumn där du specificerar för vilka grupper (ej registrerade, registrerade, etc) meddelandet skall visas.
    Då får du felxibilitet men ändå enkelhet. Dock måste du ställa en extra fråga vid visningen.

  2. En extra kolumn som sätter rättigheter. skulle kunna se ut såhär.
    1 - registrerad
    2 - ej registerad
    4 - administratör

Då skulle du kunna joina mot medlemstabellen (vilket du kanske redan gör) och köra en bitwise OR, mot de kolumnerna.

Medlem sedan juli 20011 084 inlägg
#3

Tack för din input(hade nästan gett upp hoppet ;)), jo det är ju också två tänkbara vägar. Funderade ett tag på en lösning enligt förslag 3, med liknande struktur
- tblUser_dates
id
date
user_id
- tblGroup_dates
id
date
group_id
- tblUser
user_id
user_data
- tblGroup
group_id
user_id
En enkelt fråga i alla fall, är det ett bra alternativ att lägga in ett inlägg per medlem enligt metod 2. Eller är det bara onödigt och bör undvikas?

Men jag är egentligen inte i behov av så stor skalbarhet i det här projektet så jag tror det får bli en blandning av 1:an och 4:an. Ville mest få lite feedback från andra, höra hur ni tänker. :)

Hur menar du att man skulle göra med en bitwise OR?(jag sökte på wf och hittade en tråd med några år på nacken som du startade :e) Men jag förstår dock inte riktigt hur det fungerar. Har du något exempel eller bra länktips?

Medlem sedan dec. 19995 874 inlägg
#4

Jag har skrivit en liten artikel som tar upp bitoperationer (till viss del i alla fall). Du kan läsa den här: http://www.swesecure.com/?ID=84473f97-988e-4a78-829d-b5c5d0336107&IID=8bf7deff-a328-4fa8-bf54-421eb740ac74

Vad jag menar är att användare har då endast möjlighet att vara i en grupp samtidigt. Man kan vara registrerad, ej registrerad eller administratör.

Här är ett exempel.
Notera att jag har lagt ut de speciella poster som har speciell behörighet i en egen tabell.

--grupper i detta fallet är
1 - registrerad
2 - ej registrerad
4 - administratör

declare @users table (userid int primary key, username varchar(50), [group] int)
insert into @users values (1, 'brimba', 1)
insert into @users values (2, 'mozilla', 4)
insert into @users values (3, 'unknown', 2)

declare @userid int
set @userid = 1

declare @posts table (postid int primary key, userid int, data varchar(500))
insert into @posts values (1, 1, 'visas för brimba') --skriven av brimba
insert into @posts values (2, 2, 'visas för alla registrerade') --skriven av mozilla
insert into @posts values (3, 2, 'visas för alla') --skriven av mozilla
insert into @posts values (4, 2, 'visas för alla administratörer') --skriven av mozilla

declare @postsrights table (postid int, groups int)
insert into @postsrights values (2, 1)
insert into @postsrights values (3, -1)
insert into @postsrights values (4, 4)

declare @usergroup int 
select @usergroup = [group] from @users where userid = @userid

select 
	t1.userid, t1.data
from 
	@posts t1 
	inner join @users t2 on t1.userid = t2.userid
	left join @postsrights t3 on t1.postid = t3.postid
where 
	t1.userid = @userid or (t3.groups & @usergroup)>0

Tänk dock på att det anses vara en dålig design att använda bitvärden i tabellstrukturen. Så ett annat tips (som i detta fallet fungerar utmärkt) är att ha en tabell som ser ut ungefär:

declare @table table (postid int, group)

Sedan ändrar du din left join mot @postrights till:
left join @table t3 on t1.postid = t3.postid and (t2.group = t3.group or t3.group = -1)

262 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)