Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [MySQL] Datenbankstruktur (https://www.delphipraxis.net/116922-%5Bmysql%5D-datenbankstruktur.html)

geskill 8. Jul 2008 19:08


[MySQL] Datenbankstruktur
 
Hi,
Ich habe vor ein komplexes Userverwaltungssystem zu schreiben, zum Anmelden wird das ganze in einer DB gespeichert.
Ungefähr so:

SQL-Code:
id | NAME | EMAIL | PASSWORD | EXPIRATION | LOGINS | SETTINGS
Nun habe ich noch eine 2 Tabelle mit Serverdaten, womit der User dann auf den
freigeschaltete Server connecten darf.

SQL-Code:
id | SERVERNAME | SERVER | USER | PASSWORD | PORT | DATABASE | MAXUSER

Nun zu meinem Problem bzw. ob es sinnvoll wäre es so zu machen:
In der Spallte SETTINGS möchte ich die Rechte von jedem User bestimmen,
das habe ich mir so überlegt (XML-mäßig):

Code:
<SERVER_DATABASE> // Server A
  <GROUP>Administrator</GROUP>
  <RIGHTS></RIGHTS>
</SERVER_DATABASE>

<SERVER_DATABASE> // Server B
  <GROUP>User</GROUP>
  <RIGHTS></RIGHTS>
</SERVER_DATABASE>

<SERVER_DATABASE> // Server C
  <GROUP>Manager</GROUP>
  <RIGHTS></RIGHTS>
</SERVER_DATABASE>
Zuerst wollte ich INI Strukturen verwenden, jedoch käme ich mit dem Platz für die Rechte nicht aus.
Ich wollte halt mal fragen ob es Sinn macht die Benutzer/Serverrechte so zu speichern oder ob es eine
bessere Lösung gibt. Ich bin gespannt auf eure Anworten, ich möchte aber ungern eine weitere Tabelle
erstellen.
Gruß

sx2008 8. Jul 2008 23:48

Re: [MySQL] Datenbankstruktur
 
Für eine gute User- und Rechteverwaltung brauchst du min. 6 Tabellen:
* User-Tabelle
* Rechte-Tabelle (welche Rechte gibt es überhaupt)
* Gruppen-Tabelle (Benutzergruppen)
* UserGruppen-Tabelle (welcher User ist Mitglied bei welcher Gruppe)
* Gruppenrechte-Tabelle (Welche Gruppe hat welches Recht)
* UserRechte-Tabelle (welcher User hat welches Recht)

Ein User kann Mitglied in mehreren Gruppen sein. Jede Gruppe kann 0, 1 oder mehr Rechte haben.
Der User bekommt die Summe aller Rechte aus allen Gruppen zugeteilt.
Zusätzlich kann der User auch direkt Rechte erteilt (engl. grant) oder verweigert (engl. deny) bekommen.
Wenn einen User ein Recht explizit verweigert wurde, dann kann er es auch dann nicht mehr erhalten,
wenn er es aus einer anderen Gruppe erhalten würde.

Du kannst natürlich die Gruppen ganz weglassen, aber dann wird die Sache bei vielen Usern völlig unpraktikabel.
Man kann auch User und Gruppen zu einer Tabelle zusammenfassen, was den Vorteil hat, dass Gruppen Mitglied in anderen Gruppen werden können.
Man braucht dann weniger Tabellen, aber einfacher wird's nicht.

mkinzler 9. Jul 2008 07:40

Re: [MySQL] Datenbankstruktur
 
Wobei man die GruppenRechte und UserRechte zusammenfassen kann. Man könnte u.U. auch User/Gruppen in eine Tabelle ablegen.

geskill 9. Jul 2008 13:11

Re: [MySQL] Datenbankstruktur
 
Ich glaube ich habe das ganze etwas falsch erklärt,
dass Userverwaltungssytem ist für ein Programm mit einer DB Anbindung. Das Programm an sich gibt es in
mehreren Ausführungen, welcher User welches Feature benutzen dürfen muss man in dem System verwalten
können. Unabhängig davon gibt es eine DB Anbindung, die mit dem Programm selber nichts zu tun hat,
Der DB Besitzer darf dort Regeln welcher User welche Rechte in der DB hat, also wer Daten hinzufügen,
löschen etc. darf.
Deshalb ist es besser, wenn ich eine Spalte hinzufüge, wo ich die "reinen Programmrechte" hineinschreibe.
Die Programmrechte kann man noch ein Zahlen ausdrücken, da es nicht so viele sind.

SQL-Code:
id   | NAME | EMAIL | PASSWORD | EXPIRATION | LOGINS | PROGRAM-RIGHTS | SERVER-SIDE
Jedoch finde ich es noch problematisch die Serverrechte zu verwalten da es ja mehere Server/DB
gibt.
In den Server Rechten könnte dann z.b. so etwas stehten (Boolean Werte):

XML-Code:
<SERVER_DATABASE> // Server A
  <GROUP>Administrator</GROUP>
  <RIGHTS>
    <CAN_READ>
      <TABLE_A>1</TABLE_A>
      <TABLE_A>1</TABLE_A>
    </CAN_READ>
    <CAN_ADD>
      <TABLE_A>1</TABLE_A>
      <TABLE_B>1</TABLE_B>  
    </CAN_ADD>
    <CAN_EDIT_OWN>1</CAN_EDIT_OWN>
    <CAN_EDIT>
      <TABLE_A>
        <COLUMN_1>1<COLUMN_1>
        <COLUMN_2>1<COLUMN_2>
      </TABLE_A>
    </CAN_EDIT>
    <CAN_REMOVE>
      <TABLE_A>1</TABLE_A>
      <TABLE_B>1</TABLE_B>
    <CAN_REMOVE>
  </RIGHTS>
</SERVER_DATABASE>
So ein Eintrag könnte dann natürlich sehr lang werden, wenn eine DB z.b. 6 Tabellen hat
und jede Tabelle dann nochmal 10 Spalten! Und das ganze ist nur ein Beispiel von einem Server
wenn sich dem System noch weitere Anschließen 10-20 dann will ich mir gar nicht vorstellen wie lang
dieser Eintrag pro User werden kann. Jedoch brauche ich diese Kontrolle und so ist es auch erwünscht.
Deshalb frage ich mich ob man dies nicht in die "angedockte" DB einträgt. Damit meine ich, dass in der
User Tabelle "SERVER-SIDE" komplett wegfällt und dies dem Server gespeichert wird. Das ganze steht aber
in Abhängigkeit mit dem Usern, dann müsste ich in der neuen DB eine neue Tabelle anlegen die dann so
aussieht:
SQL-Code:
NAME | EMAIL | SERVER-SIDE
Problematisch ist es dann wieder, wenn jemand die EMail-Adresse ändert, und das Problem der Verwaltung würde
ich nur auf einen anderen Server oder eine andere DB verschieben :(.

mkinzler 9. Jul 2008 13:17

Re: [MySQL] Datenbankstruktur
 
Warum machst du das nicht auch in der DB?

geskill 9. Jul 2008 13:28

Re: [MySQL] Datenbankstruktur
 
Zitat:

Zitat von mkinzler
Warum machst du das nicht auch in der DB?

Was meinst du mit "das"

Die XML Struktur?
Klar könnte ich machen, dann hätte ich eine Tabelle a la:

SQL-Code:
NAME | EMAIL | GROUP | CAN_READ | CAN_ADD | CAN_EDIT_OWN | CAN_EDIT | CAN_REMOVE
dort müsste ich dann bei CAN_READ,CAN_ADD,CAN_EDIT,CAN_REMOVE eintragen welche Tabelle,
z.b. so:
Code:
TABLE_A=1
TABLE_B=0
TABLE_C=1
oder ich würde eine sehr lange Tabelle erzeugen z.b. so:
SQL-Code:
NAME | EMAIL | GROUP | CAN_READ_TABLE_A | CAN_READ_TABLE_B | CAN_READ_TABLE_C
den Rest kann man sich ja denken ...

Die erste Variante finde ich gar nicht mal so schlecht, da würde man einiges Sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz