Frage zu Datenbank Design, Fremdschlüssel und Abfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Frage zu Datenbank Design, Fremdschlüssel und Abfrage

    Hey,

    ich habe erstmal eine Frage zu meinem grundsätzlichen Datenbank Design. Und zwar geht es hier jetzt mal um eine rechte Verwaltung für Module. Dafür habe ich 3 tabellen vorgesehen:
    Tabelle module:
    Code:
    Create table module (
       `id` int(3) PRIMARY KEY AUTO_INCREMENT,
       `name` varchar(255) NOT NULL, 
       `discription` text NOT NULL
    ) Engine = Inno DB
    Tabelle: right_groups
    Code:
    CREATE TABLE right_groups (
      `id` int(3) PRIMARY KEY AUTO_INCREMENT, 
      `name` varchar(255) NOT NULL, 
      `discription` text NOT NULL,
      `power` varchar(10) NOT NULL
    ) Engine = Inno DB
    Tabelle: module_rights
    Code:
    CREATE TABLE module_rights(
      `moduleid` int(3),
     `right_groupid` int(3)
      FOREIGN KEY (`moduleid`) REFERENCES module (`id`),
      FOREIGN KEY (`right_groupid`) REFERENCES right_groups (`id`)
      ) Engine = Inno DB
    Also Taballe 1 enthält alle Module, Tabelle 2 die verschiedenen Rechte gruppen und Tabelle 3 die beziehungen. Nun erstmal die Frage ob das ganze so sinn macht. Meiner auffassung nach müsste dies ja im Sinne der Normalform sein, wenn ich da alles richtig verstanden habe. Korrigiert mich bitte wenn ich hier schon falsch liege.

    So nun meine 2te Frage:
    Wenn ich jetzt später abfragen möchte welche "power" ein Modul benötigt kann ich dieses ja in 3 Abfragen machen. Nehmen wir mal folgende Daten an:
    Code:
    INSERT INTO module (`id`, `name`, `discription`) 
    VALUES ('1', 'news', 'news modul')
    
    INSERT INTO right_groups (`id`, `name`, `discription`, `power`) 
    VALUES ('1', 'Admin', 'Admin Rechte', '100')
    
    INSERT INTO module_rights (`modulid`, `right_groupid`) VALUES ('1', '1')
    Dafür sähen die 3 Abfragen ja dann so aus:
    Code:
    SELECT id FROM module WHERE name = 'news'
    SELECT right_groupid FROM module_rights WHERE moduleid =  'id_aus1_abfrage';
    SELECT power FROM right_groups WHERE id = 'id_aus2_abfrage'
    Ich frag mich jetzt ob das auch in 1 Abfrage möglich ist und wenn ja wie? Geht das über JOINS oder vielleicht über SubSelect? Kenne mich mit beiden nicht so aus, habe zwar zu Joins ein bischen was gelesen, allerdings ist mir der Aufbau immernoch nicht ganz klar. Wenn jemand dazu ein Beispiel geben könnte wie das in diesem Fall aussehen müsste wäre ich sehr dankbar.
    Weil ich denke mal eine Abfrage ist performanter wie 3 nacheinander abzuschicken?

    Wäre dankbar wenn da mal jemand drüber schauen könnte und mich da aufklären könnte.

    lg 2Bad4You
    Zuletzt geändert von 2Bad4You; 04.03.2010, 23:58.

  • #2
    Zitat von 2Bad4You Beitrag anzeigen
    Geht das über JOINS [...]?
    Ja, aber dir wird in einem Forum niemand ein Join-Tutorial schreiben, was auch sinnlos wäre, weil es da draußen schon so viele gibt: SQL Join Tutorial
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      OffTopic:
      Und ich dachte immer Berni wäre der einzige, der description mit i schreibt
      h.a.n.d.
      Schmalle

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



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

      Kommentar


      • #4
        Also ich wollte selbstverständlich kein ganzes tutorial haben zu den joins sondern mehr einen denkanstoß. Und Primär wollte ich eigentlich wissen ob das Datenbank Design so überhaupt sinn macht. Habe heute nochmal rumprobiert und siehe da habe es auch geschafft mit den Joins. Also für alle die eine ähnliche abfrage haben wie diese:
        Code:
        SELECT id FROM module WHERE name = 'news'
        SELECT right_groupid FROM module_rights WHERE moduleid =  'id_aus1_abfrage';
        SELECT power FROM right_groups WHERE id = 'id_aus2_abfrage'
        So sieht das ganze als eine Abfrage mit Join aus:
        Code:
        SELECT m.id , mr.right_groupid , r.power FROM module m 
        INNER JOIN module_rights mr ON m.id = mr.moduleid 
        INNER JOIN right_groups r ON mr.right_groupid = r.id
        WHERE m.name = 'news'

        Kommentar

        Lädt...
        X