Autor Zpráva
Darth-Cz-
Profil *
Dobrý den,

chtěl bych vás poprosit o pomoc s tímto:

Mám řekněme tři úrovně oprávnění (může jich být ale až N). Navrhl jsem tedy první tabulku s názvem users s údaji, které jsou pro uživatele se všemi oprávněními stejné takže tabulka users vypadá například takto:

id unsigned medium int, primary
jmeno varchar 40
prijmeni varchar 40
email varchar 40
heslo char 32
opravneni enum('admin','klient','zamestnanec')


Pro uživatele z každé skupiny oprávnění jsou ale připraveny další údaje, takže navrhuji pro každou úroveň oprávnění založit novou tabulku, s údaji, které jsou pro danou skupinu unikátní. Spojení tabulek by bylo provedeno přes users_id buňku.

Je tento návrh dobrý? Případně jak lze toto vyřešit lépe?

Pokud je dobrý, chtěl bych se zeptat, jak při přihlášení vytáhnou údaje dané osoby. Předpokládám, že proběhne přihlášení vůči tabulce users a zjistí se oprávnění. Jak ale poznám, ze které tabulky mám vybrat další data? Chtěl bych to provést v jednom dotazu, tudíž jsem myslel, že pojmenuji tabulky stejně jako oprávnění a pak provedu něco jako join users.opravneni . Nevím ale zda se dá použít hodnota z jedné tabulky jako název jiné tabulky.

Za odpověď předem děkuji.
paul27
Profil *
Dobry den,

Spise nez enum bych pouzil pro ovpravneni samostatnou tabulku Opravneni(id ..., nazev_opravneni ...). Zbyla data, ktera jsou pro kazde opravneni jina, bych dal opet do samostatne tabulky Dalsi_udaje(id ..., id_opravneni, ...). Mezi Uzivatele a Opravneni bude vztah 1:1, mezi tabulku Opravneni a Dalsi_udaje bude vztah 1:N.
Darth-Cz-
Profil *
paul27:
Toto zní dobře. děkuji.
tiso
Profil
Darth-Cz-: z tvojho popisu nechápem čo presne chceš.
Práva sa dajú riešiť rôzne zložito, všeobecne sa prideľuje právo nejakému užívateľovi na prevedenie nejakej akcie (zobrazenie stránky, editácia, mazanie, …)
Akcie sa môžu ďalej súvisieť s konkrétnymi objektami/stránkami, a užívatelia môžu patriť do nejakých skupín, takže potom sa právo dá pridať/ubrať celej skupine ľudí.
Darth-Cz-
Profil *
tiso:
Dle tvé analogie tedy myslím skupinu uživatelů :) viz. můj popis pole oprávnění. Navrhoval jsem enum z prvků administrator, klient, zamestnanec, tudíž myslím skupiny. Využívám nette, takže práva k objektům řeším v něm právě podle pole oprávnění (administrator, klient, zakaznik).

Jde mi o návrh databáze, podle popisu výše :) Návrh paul27 se mi zdá dobrý. Máš jiné řešení? :) Zatím mě lepší nenapadá.
Darth-Cz-
Profil *
paul27:
Jen k návrhu - myslím že mezi tabulkami uzivatele - opravneni bude vztah N:1 ne 1:1 (více uživatelů může mít jedno z oprávnění).
Darth-Cz-
Profil *
A když už jsme zaběhli do slovíčkaření, nevíte někdo náhodou, jaký je rozdíl mezi právem a oprávněním? Abych správně pojmenovával buňky a tabulky. Předpokládám, že zde by bylo vhodné pojmenovat tabulku skupiny_opravneni(id, nazev_skupiny) hodnoty by tedy byly administrator, klient a zakaznik.

Je to vhodné?

Jednotlivá práva by již byla nastavována v nette.
Darth-Cz-
Profil *
Když nad tím tak přemýšlím, tak ani návrh paul27 není dle mě úplně správně řešen.

Je dobré udělat zvláštní tabulku na skupiny oprávnění. S tím souhlasím, jelikož se dají přidávat další úrovně oprávnění bez zásahu do struktury tabulek. S čím nesouhlasím je tabulka Dalsi_udaje, jelikož žádný uživatel nevyužije všechny položky té tabulky. Tudíž využije jen své a všechny další buňky budou mít hodnotu NULL, což mi přijde neefektivní plýtvání. Proto jsem zavedl tabulku se společnými údaji. Tudíž se mi zdá lepší vytvořit pro každou skupinu oprávnění zvláštní tabulku s položkami, které využívá daná skupina uživatelů.

Otázkou zůstává, zda se dají tabulky spojit v jednom dotazu, jak jsem se ptal výše.

Něco jako:
select * from users join skupiny_opravneni on users.skupiny_opravneni_id = skupiny_opravneni.id join SKUPINY_OPRAVNENI.NAZEV_SKUPINY on users.id = (SKUPINY_OPRAVNENI.NAZEV_SKUPINY).users_id ....


jde mi o to, zda se dá použít hodnota bunky jako nazev tabulky.

Myslíte, že je tento návrh efektivní?
joe
Profil
Mezi uživatelem a oprávněním má být N:1, to ano, nicméně třeba při vytváření modelu v MySQL Workbench to vyjde na stejno a bude nakonec stejná DB, jako kdyby to bylo 1:1, i když správně tam má to N být...

Stačí se podívat jak je to řešené například tady. V Nette se využívají privilegie a zdroje. Tenhle doplněk to umožňuje nastavit i dynamicky, ale tvé řešení může být i statické.

A tabulku s dalšími údaji můžeš udělat jak chceš. Proč to chceš jedním dotazem? Skoro bych řekl, že bude lepší, když napřed uděláš jeden pro výběr uživatele a potom na další údaje. Budeš potřebovat další údaje hned nebo jen na nějaké konkrétní stránce? Co jsou to ty další údaje? Tabulka by mohla vypadat následovně:

id | user_id | vlasnost | hodnota

S tím, že pokud budeš mít uživatele, který bude mít 5 údajů, bude v této tabulce pro něj 5 řádků. Navíc tady už není třeba rozlišovat jakou uživatel zastává roli, to už je v tabulce users.
Darth-Cz-
Profil *
joe:
S nastavením oprávnění v nette problém nemám. Jde mi vyloženě o efektivní návrh této části databáze :)

Jeden dotaz jsem chtěl mít z důvodu kratšího kódu a doufal jsem v jeho rychlejší provedení :) V podstatě mě spíše zajímalo, jestli to jde. Není problém to napsat ani dvěma příkazy pokud to nejde jedním :)

Rozšiřující údaje jsou třeba na více stránkách.

Předpokládal jsem zhruba takovýto návrh db:

Tabulka users - spolecna pro vsechny skupiny uzivatelu

id unsigned medium int, primary key
skupiny_opravneni_id tinyint 20
jmeno varchar 40
prijmeni varchar 40
telefon char 13
email varchar 40
heslo char 32

Tabulka skupiny_opravneni

id tinyint 20, primary key
nazev_skupiny varchar 30

Tabulka klient - rozsirujici udaje pro uzivatele ve skupine opravneni klient

users_id unsigned medium int, primary key
firma varchar 50
ico char 9
dic char 11
ulice varchar 40

....
paul27
Profil *
Když nad tím tak přemýšlím, tak ani návrh paul27 není dle mě úplně správně řešen.

Souhlasim, uvedomil jsem si to tesne po odeslani meho predchoziho prispevku.

Jen k návrhu - myslím že mezi tabulkami uzivatele - opravneni bude vztah N:1 ne 1:1 (více uživatelů může mít jedno z oprávnění).

V uvodu jste pouzil pro opravneni typ ENUM, reagoval jsem na to.

Chapu to dobre, kdyz reknu, ze muze mit uzivatel vice opravneni a ke kazdemu tomuto opravneni bude pouze jeden rozsirujici udaj?
Darth-Cz-
Profil *
paul27:
Nene :) Každý uživatel může mít pouze jedno oprávnění, ale více uživatelů může mít stejné oprávnění. Proto N:1 mezi tabulkami users-skupiny_opravneni.

A ano každý uživatel bude mít společné položky + položky svého oprávnění. Když se podíváte na můj poslední příspěvek, tak v podstatě tabulka klient rozšiřuje tabulku users pro oprávnění klient. A pro každého uživatele s tímto oprávněním bude mít právě jeden záznam. Proto je tam users_id primární - nebude se opakovat id uživatele z tabulky users.
paul27
Profil *
Nene :) Každý uživatel může mít pouze jedno oprávnění, ale více uživatelů může mít stejné oprávnění. Proto N:1 mezi tabulkami users-skupiny_opravneni.

:D samozrejme, ja uz blbnu. Mate pravdu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: