Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapis tablicy uprawnień jako ciąg binarny
Forum PHP.pl > Forum > PHP
kiler129
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.
nospor
Pisałem o tym, może ci się przyda:
http://nospor.pl/opcje-dwuwartosciowe-przechowywanie.html
seth-kk
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
kiler129
@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ń.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.