Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapis tablicy uprawnień jako ciąg binarny, ...a dalej jako int/bigint
kiler129
post 23.11.2010, 19:23:41
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Witajcie!
Realizując dalej plany rozpocząłem przemyślać tablice uprawnień w CMSie. Jedna kwestia mnie zastanowiła - po co używać 30-40 kolumn w tabeli uprawnień (jak robią wszystkie znane mi CMSy) z polami int (a w nich 0/1) lub set skoro można odowołać się do systemu binarnego?
Wiedząc, że zwykły INT w MySQL (jak to wygląda w bazach FireBird, PgSQL i SQLite?) posiada zakres od -2 147 483 647 do +2 147 483 647 mogę zamienić go na system binarny co daje mi 4 294 967 295 możliwych kombinacji.
Normlanie uprawnienia to np. logowanie, komentowanie, dostęp do panelu administracyjnego, edycja newsów itd.
Zamiast zapisywać to w kilku kolumnach zapiszę to jako ciąg:
Kod
1 0 1 1

Oznaczać to może kolejno: możliwość logowania, brak możliwości komentowania, dostęp adm i możliwość edycji newsów.
Teraz gdyby zamienić to na system dziesiętny otrzymamy liczbę "11" i taką właśnie zapiszę do bazy danych.

Czy taka koncepcja ma sens? Jeśli tak to dlaczego nie widuje się jej w innych projektach? worriedsmiley.gif
Nie wiem czy dobrze wykonałem obliczenia ale z tego co patrze cały zakres int daje mi możliwość zapisania 32 uprawnień 0/1. Nie wiem jak wyglądają w innych bazach typy medium int oraz bigint - jest to uniwersalne między MySQL, PgSQL, FireBird oraz SQLite czy to tylko wynalazek MySQLa?

Z góry dziękuję za pomoc.


p.s. Droga GTW - zróbcie coś z tym wyrzucaniem z sesji bo dłuższego niż 4 linijki postu napisać się nie da normlanie.


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
nospor
post 23.11.2010, 19:30:05
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Pisałem o tym, może ci się przyda:
http://nospor.pl/opcje-dwuwartosciowe-przechowywanie.html


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
seth-kk
post 23.11.2010, 19:45:55
Post #3





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

Ostrzeżenie: (0%)
-----


1. 4 294 967 295 = 2^32 - co zrobisz gdy będziesz musiał operować na CRUDzie dla 9 modułów?
2. Operowanie na tak dużych liczbach w php może być problematyczne - zwłaszcza na 32 bitowych systemach
3. Z tego co pamiętam wymienione bazy nie mają indeksów przyspieszających wyszukiwanie bazujące na operacjach bitowych co czyni relacje dość jednostronne w większych zbiorach danych


--------------------
Go to the top of the page
+Quote Post
kiler129
post 24.11.2010, 04:22:54
Post #4





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


@nospor - rozpisałeś dokładnie to co ja chciałem zrobić smile.gif Good piece of text.

Cytat(seth-kk @ 23.11.2010, 19:45:55 ) *
1. 4 294 967 295 = 2^32 - co zrobisz gdy będziesz musiał operować na CRUDzie dla 9 modułów?
2. Operowanie na tak dużych liczbach w php może być problematyczne - zwłaszcza na 32 bitowych systemach
3. Z tego co pamiętam wymienione bazy nie mają indeksów przyspieszających wyszukiwanie bazujące na operacjach bitowych co czyni relacje dość jednostronne w większych zbiorach danych


Użyje np. 4 kolumn smile.gif Wtedy 1 kolumna - 1 moduł.
Dodatkowo mogę operować na systemie binarnym jak na tekście - wtedy problem 32 bitowego systemu znika.
Rozkładam sobie 01101... na tablicę asocjacyjną funkcją która ma mapę i w rezultacie dostaję:
Kod
$rights = array() {
   "user" => array(
                            "login" => int(1),
                            "comments" => int(0)
                           )
   "newses" => array(
                                "active" => int(1),
                                "add" => int(1),
                                "delete" => int(1),
                                "others_edit_del" => int(0)
                               )
}


I do metody odowłam się np. $_adminPanel->rightTable("newses") co zwróci mi element tablicy $rights. Wtedy dużo wygodniej będzie operować w kodzie niż na czystych bitach.
Dodatkowo to rozwiązanie ma jeden plus - pluginy mogą używać tej samej tablicy uprawnień.


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:22