Relationale DB Userrankings umgestaltung

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Relationale DB Userrankings umgestaltung

    Hey,

    im Zuge meiner Optimierungen ist mir aufgefallen das meine bisheriger Table mit den Userverwaltungen voll krank ist.....

    Bisher hatte ich:
    1. Table: Wo alle Daten über User drinnstehen, userid ist der Primärschlüssel.
    2.) Table Rankings: Mit lauter Attributen für verschiedene Scripte ob man darf oder net....

    Dabei wurden Einzelberechtigungen wie "Darf nur posten", "Darf nicht löschen" nicht berücksichtigt.
    Das Script hat z.B. nur Administatoren erlaubt im Gästebuch Einträge zu löschen, Moderatoren waren da grundsätzlich ausgenommen.

    Wenn weitere Rechte hinzukommen wirds heikel
    Abgesehen davon sollten zu jeder Berechtigung auch eine Kurzbeschreibung hinterlegt werden. Wenn ich z.B. die Berechtigungen anzeigen lassen möchte.

    Dadurch bin ich erst auf diesen an und für sich Bullshit draufgekommen.


    Also ich stells mir mal so vor (unvollständig)

    Usertable:
    userid loginID loginPW SessionID name vorname
    1
    2
    3

    grpRanks Table
    grpID grpRankDesc
    1 Newsadministration
    2 GBadministration
    3

    Ranks
    rankID rankDesC grpID
    1 post News 1
    2 edit News 1
    3 delte News 1
    4 new com 2 2
    5 edit com 2
    6 edit entry 2
    7 delete entry 2

    Stellt sich jetzt nur die Frage wie man jetzt effizent den User mit den Berechtigungen verknüpft......
    [color=blue]MfG Payne_of_Death[/color]

    [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
    [color=red]Merke:[/color]
    [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

    Murphy`s Importanst LAWS
    Jede Lösung bringt nur neue Probleme
    Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
    In jedem kleinen Problem steckt ein großes, das gern raus moechte.

  • #2
    tabelle user
    tabelle gruppen

    tabelle user-gruppen

    tabelle rechte

    tabelle user-rechte mit spalte allowed
    tabelle gruppe-rechte mit spalte allowed

    spontaner vorschlag von mir

    wenn gruppe 1 recht 1 hat, schreibst du in tabelle gruppe-rechte: 1 | 1 | 1

    soll jetzt user 3 als einziges mitglied von gruppe 1 das recht 1 nicht haben, chreibst du in user-rechte: 3 | 1 | -1


    bei der abfrage fragst du auf die userid ab (kriegst du ja über die session) und da, wo allowed > 0 is, da darf er sich austoben

    das mit dem allowed is aber nur optional *g*
    Ich denke, also bin ich. - Einige sind trotzdem...

    Comment


    • #3
      Mit einer simplen Meta-Table n:m (grpRanks:ranks) ...
      Yuppi, endlich Elite ...

      Comment


      • #4
        hab das jetzt mal nicht so genau gelesen aber ich mache das folgendermassen.

        eine tabelle userdaten
        eine tabelle userrechte

        die rechte stehen als textblock drin. zb.:
        Code:
         news loeschen,lesen,schreiben
        templates bearbeiten,loeschen etc
        beim login werden die zugeordneten rechte ein mal eingelesen, und in der session als array gespeichert. das mitdenkende menue muss nun beim aufbau nur noch gucken, welche links angezeigt werden sollen und welche nicht. ganz einfach ...
        h.a.n.d.
        Schmalle

        http://impressed.by
        http://blog.schmalenberger.it



        Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
        ... nur ohne :-)

        Comment


        • #5
          Original geschrieben von mrhappiness
          tabelle user
          tabelle gruppen

          tabelle user-gruppen

          tabelle rechte

          tabelle user-rechte mit spalte allowed
          tabelle gruppe-rechte mit spalte allowed

          spontaner vorschlag von mir

          wenn gruppe 1 recht 1 hat, schreibst du in tabelle gruppe-rechte: 1 | 1 | 1

          soll jetzt user 3 als einziges mitglied von gruppe 1 das recht 1 nicht haben, chreibst du in user-rechte: 3 | 1 | -1


          bei der abfrage fragst du auf die userid ab (kriegst du ja über die session) und da, wo allowed > 0 is, da darf er sich austoben

          das mit dem allowed is aber nur optional *g*
          Nimms mir net übel aber ich versteh gerade nur Bahnhof und Abfahrt.......
          Vielleicht wenn ich früber schlaf verstehe ich es oder wenn du ein Beispiel bringen könntest.

          Wäre äusserst liebensgewürzig......
          [color=blue]MfG Payne_of_Death[/color]

          [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
          [color=red]Merke:[/color]
          [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

          Murphy`s Importanst LAWS
          Jede Lösung bringt nur neue Probleme
          Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
          In jedem kleinen Problem steckt ein großes, das gern raus moechte.

          Comment


          • #6
            Momentan sind die Lösungen noch net annehmbar, denn wie gesagt ich brauche eine sich dynamisch erweiterbare DB-Berechtigungstruktur, d.h. sie muss mitwachsen können und dies kann dann irgendwie nur mit Einrichtungstabellen passieren...........

            Einrichtung Ranks
            rankID name desc
            0 post News Eintrag hinzufügen
            1 edit News Eintrag updaten
            2 delete News Eintrag entfernen
            3 post comment Kommentar abgeben
            4 del comment Kommentar löschen

            Einrichtung GrpRanks
            grpRankID name desc
            0 News News Administration
            1 GB GB Administration
            2 Links Links Administration


            GrpRanks_Ranks
            ID grpRankID rankID
            0 0 0
            1 0 1
            2 0 2
            3 1 3
            4 1 4

            Usertable:
            userid loginID loginPW SessionID name vorname
            1
            2
            3

            Folglich habe ich jetzt:
            - eine Table bei welcher ich alle Berechtigungen eintragen kann, die vergeben werden können
            - eine Table bei welcher alle Gruppenrechte hinterlegt sind, wird benötigt um später nach einzelnen Gesichtspunkten die Berechtigungen anzeigen zu können.
            - eine Table bei der die Gruppen mit den Berechtigungen verknüpft werden
            - eine Usertable ist ja klar


            Nun fehlt nur noch eine Möglichkeit die Berechtigungen der User erfassen zu können, jedoch müssen die aus den Einrichtungstables kommen und können nicht fix als Attribute in einer m:n Table mitgegeben werden.

            Da hab ich nun im Moment auch mein Problem wie soll ich das jetzt machen?

            - Mit DB mitteln möglich
            - Oder brauche ich hier entsprechende Update Statmente
            [color=blue]MfG Payne_of_Death[/color]

            [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
            [color=red]Merke:[/color]
            [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

            Murphy`s Importanst LAWS
            Jede Lösung bringt nur neue Probleme
            Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
            In jedem kleinen Problem steckt ein großes, das gern raus moechte.

            Comment


            • #7
              Original geschrieben von mrhappiness
              tabelle user
              tabelle gruppen

              tabelle user-gruppen

              tabelle rechte

              tabelle user-rechte mit spalte allowed
              tabelle gruppe-rechte mit spalte allowed
              Code:
              recht
              recht_id | recht_name
              1 | lesen
              2 | denken
              3 | spezialrecht
              
              gruppe
              gruppe_id | gruppe
              1 | gruppe 1
              2 | gruppe 2
              
              gruppe_rechte
              gruppe_id | recht_id
              1 | 1
              2 | 1
              1 | 2
              
              user
              user_id | user_name
              1 | mrhappiness
              2 | pod
              3 | noch änna
              
              user_gruppe
              user_id | gruppe_id
              1 | 1
              2 | 1
              3 | 2
              1 | 2
              
              user_recht
              user_id | recht_id
              1 | 3
              2 | 3
              verständlicher?

              abfragen können solltest du mit nem mehr oder weniger einfachen SELECT
              Ich denke, also bin ich. - Einige sind trotzdem...

              Comment


              • #8
                jo danke, habs gerade im Visio grafisch modeliert und siehe da
                damit kann ich doch glatt jeden noch so kranken Mist anstellen
                [color=blue]MfG Payne_of_Death[/color]

                [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                [color=red]Merke:[/color]
                [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                Murphy`s Importanst LAWS
                Jede Lösung bringt nur neue Probleme
                Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                Comment


                • #9
                  Original geschrieben von Payne_of_Death
                  habs gerade im Visio grafisch modeliert und siehe da
                  damit kann ich doch glatt jeden noch so kranken Mist anstellen
                  hätteste das besser mal schon am 27.12.03 gemacht

                  das mit dem "allowed" kannste dir ja mal durch den kopf gehen lassen, sollte aber nicht nötig sein
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Comment


                  • #10
                    OffTopic:

                    Ich hab mich mit meiner Denkmurmel zu diesem Zeitpunkt in einer Sackgasse verrennt...



                    Aber was genau meinst du mit allowed. Egal was das sein soll ich habs noch nie gemacht bzw. verwendet..........

                    Allowed = Dürfen soviel ist klar
                    [color=blue]MfG Payne_of_Death[/color]

                    [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                    [color=red]Merke:[/color]
                    [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                    Murphy`s Importanst LAWS
                    Jede Lösung bringt nur neue Probleme
                    Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                    In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                    Comment


                    • #11
                      Mal ne Frage zu einem SQL Statement...

                      Hey,

                      als dieser Teil einer Abfrage soll für einen User die Rechte die er in Gruppe X besitzt ermitteln.

                      Problem ist: Ich muss die Table gruppe auch mit ins Spiel bringen, da ich über den Gruppen Name die Ausgrenzung machen möchte. Nun aber wo soll ich die Table verknüpfen??? Überall wo ich es mit inner join ansetze komm ich nicht mehr in die nächste Table rein.

                      Ich brauche praktisch einen Pfad der in einer Sackgasse endet und trotzdem noch weitergeht zur nächsten Table. Tippe mal spontan das ich da mit LEFT OUTER JOIN weiterkomme, wie mich der Name vermuten lässt....

                      Lässt sich die Abfrage Performancetechnisch noch verbessern???
                      Sorry bin kein SQL Guru....

                      Code:
                      SELECT
                            *
                      FROM
                          adminuser inner join adminuser_gruppe on adminuser.user_id = adminuser_gruppe.user_id
                      INNER JOIN
                                gruppe_rechte on adminuser_gruppe.gruppe_id = gruppe_rechte.gruppe_id
                      INNER JOIN
                                adminuser_rechte on gruppe_rechte.recht_id = adminuser_rechte.recht_id
                      INNER JOIN
                                rechte on adminuser_rechte.recht_id = rechte.recht_id
                      WHERE
                           adminuser.user_id='1'
                      [color=blue]MfG Payne_of_Death[/color]

                      [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                      [color=red]Merke:[/color]
                      [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                      Murphy`s Importanst LAWS
                      Jede Lösung bringt nur neue Probleme
                      Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                      In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                      Comment


                      • #12
                        mal ganz blöd gefragt: was steht in adminuser_rechte und adminuser_gruppe was nicht auch in den "normalen" tabellen platz gefunden hätte?
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Comment


                        • #13
                          mal ganz blöd geantwortet

                          adminuser_gruppe
                          user_id
                          gruppe_id

                          Hier kommt jeder User so oft vor wie er in den einzelnen Berechtigungsgruppen auftaucht. Bsp:

                          user_id gruppe_id
                          1 1
                          1 2
                          1 3
                          2 1

                          Hat ein User in einer Berechtigungsgruppe kein Recht so taucht auch hier kein Datensatz auf!


                          adminuser_rechte
                          user_id
                          recht_id

                          Dort kann man jede Einzelberechtigung unabhängig der Rechte Gruppenzugehörigkeit einsehen.

                          Also um vom Prinzip eine schnelle Statistik zu erstellen User X darf das alles machen......


                          Nochwas die Gruppen werden auch dazu benötigt um z.B. die Einzelberechtigungen gruppiert in Forms darzustellen.
                          Wenn ich z.B. in einer Schnellauswahl alles was zum Gästebuch dazugehört editieren möchte. Muss die DB wissen welche Rechte soll ich nehmen wenn der Typ da das GB administrieren möchte

                          Brauchen tu ich das schon.........
                          [color=blue]MfG Payne_of_Death[/color]

                          [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                          [color=red]Merke:[/color]
                          [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                          Murphy`s Importanst LAWS
                          Jede Lösung bringt nur neue Probleme
                          Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                          In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                          Comment


                          • #14
                            Ermittelung der Berechtigung

                            Hey,

                            möchte euren Rat mal einholen hinsichtlich der Verfahren zur Ermittelung von Userberechtigungen und dessen updaterei

                            Zunächst einmal kann ich über meine Relationale Datenbank ganz einfach für jeden User rausfinden ob er das und jenes im Script machen darf.
                            Sofern kein entsprechender Datensatz vorhanden ist hat er dieses Recht nicht.

                            Wenn ich das ausgeben lassen sehe ich ja nur was er darf, ich möchte aber eine Übersicht erhalten was es für Rechte gibt und diese dann entsprechend updaten.

                            Momentan hab ich eine Option Feld für den User, Berechtigungsgruppen(Scripte) und anschießend werden alle Rechte via Array in einer Table mit Option Feldern ausgegeben.......

                            Jetzt müssen nur noch die Optionen yes und no in den Rechteoptionfeldern gesetzt werden.

                            Ich hab mir momentan 2 Möglichkeiten erdacht wobei ich zur letzteren tendiere aufgrund der DB Performance.........


                            1. Möglichkeit:
                            Ich lasse über eine Schleife SQL Statments setzen, die über die Relationale DB abfragen ob der Datensatz existiert oder nicht und das dann alles in Rückgabe Array eintragen.....
                            Halte ich für Unperformant

                            2. Möglichkeit:
                            Ich hole mir zunächst über DB alle Datensätze für User X (seine Rechte)
                            Hole mir noch alle möglichen Rechte
                            je beides in Arrays
                            Und vergleiche die beiden Arrays miteinander....
                            Das wären dann 2 Sql Statment statt 37!

                            Habt ihr vielleicht noch bessere Ideen???
                            [color=blue]MfG Payne_of_Death[/color]

                            [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                            [color=red]Merke:[/color]
                            [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                            Murphy`s Importanst LAWS
                            Jede Lösung bringt nur neue Probleme
                            Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                            In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                            Comment


                            • #15
                              Code:
                              SELECT
                                u.user_id, u.user_name, 
                                IF(ISNULL(ur.user_id), 'nein', 'ja') darf,
                                r.right_id, r.right_name  
                              FROM
                                user u
                                LEFT JOIN user_right ur ON u.user_id=ur.user_id
                                  RIGHT JOIN right r ON r.right_id=ur.right_id
                              so?

                              ohne garantie, aber die grundsätzliche idee sollte klar geworden sein
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Comment

                              Working...
                              X