Toon posts:

[MySQL] Welk column type voor deze situatie?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel ik wil een lijst permissies in 1 veld opslaan.
Ik kan dit doen door de permissies in een vaste volgorde te zetten en ze dan aan (1) of uit (0) te zetten:
code:
1
2
3
4
read     1
edit     1
append   0
delete   1

Er zou dan 1101 in het veld komen te staan. Zoiets kan met SET, maar ik wil er nog een waarde bij. Een permissie moet ook op NULL gezet kunnen worden (leeg dus) (in dat geval wordt de permissie uit een andere tabel geplukt)

Is er een column type waarmee ik van bijv 64 permissies de waarden op NULL, 0 en 1 kan zetten? Anders neem ik gewoon een TINYTEXT met een reeks tekens (' ', '0' en '1') waarbij de spatie als NULL geldt.

Verwijderd

Misschien kan je hier iets mee:

[topic=481432/1/25]

Verwijderd

een set..

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
d0g1e:
Is er een column type waarmee ik van bijv 64 permissies de waarden op NULL, 0 en 1 kan zetten? Anders neem ik gewoon een TINYTEXT met een reeks tekens (' ', '0' en '1') waarbij de spatie als NULL geldt.
Oplossing zijn al gegeven maar even het volgende. Dit zou heel stom zijn als je dat laatste wat je zegt zou doen. Dan kun je beter een tinyint nemen en dan gewoon de 0 typen, want tinyint is veel sneller.

  • leonardo1504
  • Registratie: April 2001
  • Niet online
Volgens mij vraagt je applicatie om een ander datatype dan je database.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 07:16
Gewoon een byte of int nemen en dan met binary operators gaan werken.
read=1
edit=2
append=4
delete=8

aanzetten: int varnaam=varnaam||read
uitzetten: int varnaam=varnaam&!read

Misschien als je niet zoveel rechten nodig hebt (8) kun je een unsigned tinyint gebruiken. De waarden die je dan mag gebruiken zijn:
1 2 4 8 16 32 64 128

Zie ook: http://gathering.tweakers.net/forum/list_message/13380820#13380820

Verwijderd

64 permissies
Misschien als je niet zoveel rechten nodig hebt (9)
:X

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 07:16
Het gaat om het principe. In zijn geval zal ie voor een BigInt moeten gaan, of opslitsen in 2 of 3 andere typen. (unsigned wel!)
---edit---
lees net in de manual dat bigint niet echt te adviseren is... ik zou voor 2 unsigned int's gaan dan. Kun je tenminste in PHP er ook mee werken.

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:12 schreef ddc het volgende:

[..]

Oplossing zijn al gegeven maar even het volgende. Dit zou heel stom zijn als je dat laatste wat je zegt zou doen. Dan kun je beter een tinyint nemen en dan gewoon de 0 typen, want tinyint is veel sneller.
unsigned TINYINT is toch 0 - 255? dat is dus max 3 digits, dus in mijn geval max 3 permissies...

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:14 schreef Jelmer Barhorst het volgende:
Gewoon een byte of int nemen en dan met binary operators gaan werken.
read=1
edit=2
append=4
delete=8

aanzetten: int varnaam=varnaam||read
uitzetten: int varnaam=varnaam&!read

Misschien als je niet zoveel rechten nodig hebt (8) kun je een unsigned tinyint gebruiken. De waarden die je dan mag gebruiken zijn:
1 2 4 8 16 32 64 128
ik heb dat andere draadje ook gelezen, maar je kunt nu alleen een permissie aan (1) en uit (0) zetten. hoe zet je hem in dit geval op NULL (leeg) ?

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
d0g1e:
unsigned TINYINT is toch 0 - 255? dat is dus max 3 digits, dus in mijn geval max 3 permissies...
ROTFL :D :X

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 07:16
Op woensdag 08 mei 2002 13:22 schreef d0g1e het volgende:

[..]

ik heb dat andere draadje ook gelezen, maar je kunt nu alleen een permissie aan (1) en uit (0) zetten. hoe zet je hem in dit geval op NULL (leeg) ?
uh gewoon 0? Dan staat alles gewoon uit aangezien de eerste premisie de waarde 1 heeft. Overigens, in MySQL kun je geen NULL aan een integertype toekennen, dit wordt automagisch 0.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 08 mei 2002 13:18 schreef Xan het volgende:
:X
Mja, wil jij _per_ entitie meer dan 64 rechten toekennen?
Dat zijn er wel vrij veel dan ;)
Op woensdag 08 mei 2002 13:21 schreef d0g1e het volgende:
unsigned TINYINT is toch 0 - 255? dat is dus max 3 digits, dus in mijn geval max 3 permissies...
Als je dan eerst es probeert begrijpend te lezen :)

In dat 'php rechten systeem' topic staat alles al voorgekauwd.

Verwijderd

Ja waarom moet een permissie NULL kunnen zijn?

ACM, ik heb geen idee wat een entitie is :7 en 64 rechten heb ik ook niet nodig maar de topicstarter wel :).

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:20 schreef Jelmer Barhorst het volgende:
Het gaat om het principe. In zijn geval zal ie voor een BigInt moeten gaan, of opslitsen in 2 of 3 andere typen. (unsigned wel!)
---edit---
lees net in de manual dat bigint niet echt te adviseren is... ik zou voor 2 unsigned int's gaan dan. Kun je tenminste in PHP er ook mee werken.
en als je de performance van 1 tinytext vs 2 unsigned int's zou vergelijken?

in 1 tinytext kun je 255 permissies proppen, in 2 unsigned int kun je er 20 kwijt...(met mijn methode dan)

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
d0g1e :
en als je de performance van 1 tinytext vs 2 unsigned int's zou vergelijken?

in 1 tinytext kun je 255 permissies proppen, in 2 unsigned int kun je er 20 kwijt...(met mijn methode dan)
NEEEEEEEEE |:(

Ehm in een int gaat wel meer dan 20 hoor :{

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:25 schreef Xan het volgende:
Ja waarom moet een permissie NULL kunnen zijn?
dat heb ik al verteld in mijn eerste post, als een stukje van een permissie leeg is, dan wordt het opgevuld door een permissie uit een andere tabel (een standaarden tabel bijv)

los voorbeeld:

article permissie:
10

section permissie:
1100101


uiteindelijke permissie:
1100110

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Doet iets met Cloud (MS/IBM)


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 07:16
Op woensdag 08 mei 2002 13:25 schreef d0g1e het volgende:

[..]

en als je de performance van 1 tinytext vs 2 unsigned int's zou vergelijken?

in 1 tinytext kun je 255 permissies proppen, in 2 unsigned int kun je er 20 kwijt...(met mijn methode dan)
Hoe wil je dan meerdere combinaties gaan opslaan?


Ik heb trouwens nog eens grondig doorgelezen wat je wil, maar denk dat je dan met SET('Y','N','D') moet gaan werken. Dan moet je dus wel voor elk recht een nieuwe kolom maken..
Tristate primitive types bestaan zover ik weet nog niet..

Verwijderd

Topicstarter
boehoehoe, jullie snappen me niet :P

stel ik wil een heleboel vakjes vullen met 3 verschillende waarden (0, 1 en 2)

0 = uit
1 = aan
2 = leeg (haal de permissie uit een andere tabel)

zo dus:
code:
1
2
3
 ___________________________________
| 1 | 0 | 2 | 1 | 1 | 0 | 1 | 1 | 2 |
 ~~~~~~~~~~~~~~~~~~

dan kan ik er in een INT maar 20 kwijt toch?
en in een TINYTEXT 255 toch?

dit kan naar mijn weten niet op de 'php rechten systeem' manier

  • leonardo1504
  • Registratie: April 2001
  • Niet online
Alle oplossers hier gaan uit van tweewaardige logica, terwijl de vraagsteller aangaf driewaardige logica te willen toepassen (permitted/not_permitted/undefined). Nu kan je een db veld NULL maken (undefined) maar niet een deel van een veld. Conclusie: als je voor iedere permissie een bit reserveert, en je wil driewaardige logica, dan moet je ieder bit in een eigen veld stoppen (= 1 veld per permissie). Als dat niet gewenst is moet je een datarepresentatie zoeken die wel kan. Je kan denken aan twee bitstrings: De ene vertelt per permissie of de rechten wel of niet defined zijn (bijv. 1=defined, 0=undefined). Als een permissie gedefinieerd is (bit is 1) kan je in de tweede bitstring opzoeken of iets toegestaan is of niet. Je kan zelfs een derde bitstring definieren (GLOBAL) Die je als een masker gebruikt om terug te vallen op default permissies bij ongedefinieerde velden. Per bitpositie(=permissie) zet je daarin een 1 als de default 'permitted' is en een 0 als het 'not_permitted' is.

De Booleaanse logica die er bij hoort mag je zelf uitpuzzelen

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:32 schreef leonardo1504 het volgende:
Alle oplossers hier gaan uit van tweewaardige logica, terwijl de vraagsteller aangaf driewaardige logica te willen toepassen (permitted/not_permitted/undefined). Nu kan je een db veld NULL maken (undefined) maar niet een deel van een veld. Conclusie: als je voor iedere permissie een bit reserveert, en je wil driewaardige logica, dan moet je ieder bit in een eigen veld stoppen (= 1 veld per permissie). Als dat niet gewenst is moet je een datarepresentatie zoeken die wel kan. Je kan denken aan twee bitstrings: De ene vertelt per permissie of de rechten wel of niet defined zijn (bijv. 1=defined, 0=undefined). Als een permissie gedefinieerd is (bit is 1) kan je in de tweede bitstring opzoeken of iets toegestaan is of niet. Je kan zelfs een derde bitstring definieren (GLOBAL) Die je als een masker gebruikt om terug te vallen op default permissies bij ongedefinieerde velden. Per bitpositie(=permissie) zet je daarin een 1 als de default 'permitted' is en een 0 als het 'not_permitted' is.

De Booleaanse logica die er bij hoort mag je zelf uitpuzzelen
juist, maar waarom twee int's gebruiken als 1 tinytext makkelijker is.
als je twee ints gebruikt kun je uiteindelijk nog maar 32 permissies geven, toch?

1 int om aan te geven of een permissie undefined is of niet
1 int om aan te geven of een permissie aan of uit staat

INT = 2^32 combinaties dus als je de 'php rechten systeem' methode gebruikt kun je er 32 permissies in kwijt.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
Wellicht offtopic, maar je kan dus beter bitsets gebruiken en eventueel anders serialize, maar deze oplossing is (licht uitgedrukt) 'niet slim'.

Verwijderd

Maar wat is dan het voordeel van 101010101110101001101 tov 1, 2, 4 enz?

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:41 schreef ddc het volgende:
Wellicht offtopic, maar je kan dus beter bitsets gebruiken en eventueel anders serialize, maar deze oplossing is (licht uitgedrukt) 'niet slim'.
ik ben helemaal geen expert, dus leg uit (bitsets? serialize?) en waarom is deze methode niet slim?

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
d0g1e:
ik ben helemaal geen expert, dus leg uit (bitsets? serialize?) en waarom is deze methode niet slim?
LEES DAN |:(
Xan:
Misschien kan je hier iets mee:

[topic=481432/1/25]

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 08 mei 2002 13:25 schreef Xan het volgende:
ACM, ik heb geen idee wat een entitie is :7
Zie woordenboek ;)
Kan ook bij entiteit staan ;)
Op woensdag 08 mei 2002 13:37 schreef d0g1e het volgende:
juist, maar waarom twee int's gebruiken als 1 tinytext makkelijker is.
Makkelijker ??
Dat lijkt maar zo, zodra je er allerlei enge selects op wilt doen is dat niet meer het geval.

Overigens kan je in een bigint 64 rechten kwijt. Maar ga eerst es bij jezelf te rade _of_ je er wel 64 wilt.

Ik kan me maar weinig situaties voorstellen waar er zoveel te definieren zijn. In de meeste gevallen houdt het met een stuk of 5-10 rechten wel op (per entiteit/object/whatever).

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:42 schreef Xan het volgende:
Maar wat is dan het voordeel van 101010101110101001101 tov 1, 2, 4 enz?
dat is er niet, maar ik zie niet hoe ik met 3 waarden (dus 0,1 en 2) 1 getal in de vorm van 1, 2, 4 kan maken.
behalve als je twee ints gebruikt, waarin 1 int aangeeft welke digits undefined zijn en welke defined zijn, maar dat levert meer php code op. de tinytext kan in dit geval 255 permissies aan met weinig php code werk, terwijl de 2 int's veel werk opleveren voor 32 combinaties.... :r

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
d0g1e:
dat is er niet, maar ik zie niet hoe ik met 3 waarden (dus 0,1 en 2) 1 getal in de vorm van 1, 2, 4 kan maken.
behalve als je twee ints gebruikt, waarin 1 int aangeeft welke digits undefined zijn en welke defined zijn, maar dat levert meer php code op. de tinytext kan in dit geval 255 permissies aan met weinig php code werk, terwijl de 2 int's veel werk opleveren voor 32 combinaties.... :r
En dus ga je nu lezen en kom je dan terug.
Doei :).

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 08 mei 2002 13:47 schreef d0g1e het volgende:
Leer binair rekenen, ipv 10-tallig ;)
Dan kan je in een 32-bits getal 32 bits kwijt en die 32 bits kan je dan prima mee rekenen.

Ookal zet je het dan stiekem weer om naar 10-tallig. Als je liever octaal of hexadecimaal rekent kan dat natuurlijk ook. Is nog duidelijker ook met bits etc.

Verwijderd

Je hebt dan ook geen 3 waarden nodig...

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:46 schreef ACM het volgende:

[..]

Zie woordenboek ;)
Kan ook bij entiteit staan ;)
[..]

Makkelijker ??
Dat lijkt maar zo, zodra je er allerlei enge selects op wilt doen is dat niet meer het geval.

Overigens kan je in een bigint 64 rechten kwijt. Maar ga eerst es bij jezelf te rade _of_ je er wel 64 wilt.

Ik kan me maar weinig situaties voorstellen waar er zoveel te definieren zijn. In de meeste gevallen houdt het met een stuk of 5-10 rechten wel op (per entiteit/object/whatever).
ik ga er geen ENGE selects op doen. je haalt de waarde binnen in je script, komen er 2tjes in voor dan haal je nog een waarde uit een andere tabel op, voeg de twee samen, zodat je weer 10101010101001010010 krijgt en gebruik de php rechten methode, dan lijkt mij de int methode moeilijker

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 08:34
d0g1e:
ik ga er geen ENGE selects op doen. je haalt de waarde binnen in je script, komen er 2tjes in voor dan haal je nog een waarde uit een andere tabel op, voeg de twee samen, zodat je weer 10101010101001010010 krijgt en gebruik de php rechten methode, dan lijkt mij de int methode moeilijker
Je weigert ook enige inzet hè :(

Verwijderd

Topicstarter
Op woensdag 08 mei 2002 13:50 schreef ACM het volgende:

[..]

Leer binair rekenen, ipv 10-tallig ;)
Dan kan je in een 32-bits getal 32 bits kwijt en die 32 bits kan je dan prima mee rekenen.

Ookal zet je het dan stiekem weer om naar 10-tallig. Als je liever octaal of hexadecimaal rekent kan dat natuurlijk ook. Is nog duidelijker ook met bits etc.
Dat wil ik best doen, maar ik zie niet in hoe ik die NULL waarde erin krijg. Ik kan leuke binaire reeksen maken maar hoe geef je in zo'n reeks aan een permissie ongedefinieerd is enz.

Maarja ik ga die andere thread nogmaals lezen en anders bel ik de database guru wel even

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 08 mei 2002 13:51 schreef d0g1e het volgende:
ik ga er geen ENGE selects op doen. je haalt de waarde binnen in je script, komen er 2tjes in voor dan haal je nog een waarde uit een andere tabel op, voeg de twee samen, zodat je weer 10101010101001010010 krijgt en gebruik de php rechten methode, dan lijkt mij de int methode moeilijker
Ik gok dat je eerst even beter over je rechten-model na moet denken voor je de opslag gaat bepalen :)

Als _per_ recht enkele 0 of 1 gebeurt -> sla ze binair op in een integer (ofzo). Zie de genoemde url naar dat andere topic voor het beheren ervan en werken ermee.

Als je _per_ recht meerdere dingen wilt doen, wordt het vervelender ;) Maar meestal is dat te reduceren tot 'aan' en 'uit' (eventueel door opsplitsing).

Overigens bedoel ik met enge queries dingen als:
Selecteer iedereeen met als rechten 'edit rechten', 'schrijf rechten in gebied A', 'append rechten'

Oftewel samen gestelde rechten opzoek-acties. Dat kan met één enkele vergelijking als je dat met integers (binair) uitvoert. Maar moet met meerdere vergelijkingen als je met tekst werkt.
De eerste is dus niet alleen simpeler dan, maar ook nog es vele malen duidelijker en efficienter.
Pagina: 1