Benutzer mehreren Gruppen zuweisen

EddieG

Erfahrenes Mitglied
Hi,
ich bin dabei ein Benutzerverwaltung zu schreiben und stehe nun vor dem folgenden Problem.
Ich kann Benutzer einer Gruppe zuweisen, jedoch nicht mehreren Gruppen gleichzeitig (1:n).
Mein Ansatz wäre sobald eine neue Gruppe hinzugefügt wird, wird die Users Tabelle um eine Spalte erweitert, in der die neue Gruppe steht etc...
Da so etwas aber eher unschön ist, wenn man Beispielsweise 100 Gruppen angelegt hat und die Users Tabelle um 100 spalten erweitert wurde.
Deshalb meine Frage wie könnte ich das denn noch lösen?
Mein Aufbau der Tabellen.
-----user_groups-----
`groupID` int(11) NOT NULL auto_increment,
`groupName` varchar(50) NOT NULL,
`access` int(11) NOT NULL,
`depID` int(11) NOT NULL,
PRIMARY KEY (`groupID`)

-----Users-----
`userID` int(11) NOT NULL auto_increment,
`username` varchar(50) NOT NULL,
`Password` varchar(50) NOT NULL,
`groupID` int(11) NOT NULL,
`Email` varchar(255) NOT NULL,
`lastLogin` date NOT NULL,
`sup` int(11) NOT NULL,
`upl` int(11) NOT NULL,
`dirC` int(11) NOT NULL,
`depID` int(11) NOT NULL,
`glob_admin` int(11) NOT NULL,
 
Klassischer Fall von n:n.

Dazu machst du eine 3. Tabelle, in der die ids der User mit den ids der Gruppen kombiniert werden.

`groupID` int(11) NOT NULL ,
`userID` int(11) NOT NULL,
PRIMARY KEY (`userID`, `groupID`)

Pro User-Gruppen Kombination kommt hier ein Eintrag rein
 
hm..
das heißt in schritten:
1.Benutzer anlegen
2.Gruppe zuordnen
3.beides in die dritte Tabelle eintragen.
4.Benutzer anderer Gruppe zuweisen
5.Benutzer und die neue Gruppe wieder in dritte Tabelle eintragen
--------------------
Wenn ich nun noch Dateien für mehrere Gruppen freigeben möchte
müsste ich das selbe noch ein mal machen noch mal eine Tabelle anlegen.
und anschließen Gruppe mit Dateien kombinieren.
Stimmt das so in etwa oder habe ich das ganze komplett falsch verstanden ;)?
 
hm..
das heißt in schritten:
1.Benutzer anlegen
2.Gruppe zuordnen
3.beides in die dritte Tabelle eintragen.
4.Benutzer anderer Gruppe zuweisen
5.Benutzer und die neue Gruppe wieder in dritte Tabelle eintragen
--------------------
Wenn ich nun noch Dateien für mehrere Gruppen freigeben möchte
müsste ich das selbe noch ein mal machen noch mal eine Tabelle anlegen.
und anschließen Gruppe mit Dateien kombinieren.
Stimmt das so in etwa oder habe ich das ganze komplett falsch verstanden ;)?

du hast das komplet richtig verstanden
 
ja das stimmt so.
Im Grunde fast die selbe Struktur

Code:
`groupID` int(11) NOT NULL,
`filename` varchar(50) NOT NULL ,
PRIMARY KEY ( `groupID`)

damit hast du eine 1:n Beziehung zwischen Files und Gruppen.

@yslaw:
Bist du sicher das userID in deinem Beispiel unique sein sollte?
Er will ja einen Benutzer mehreren Gruppen zuweisen. Also 1:n.
Code:
`groupID` int(11) NOT NULL ,
`userID` int(11) NOT NULL,
PRIMARY KEY (`groupID`)
 
@yslaw:
Bist du sicher das userID in deinem Beispiel unique sein sollte?
Er will ja einen Benutzer mehreren Gruppen zuweisen. Also 1:n.
Code:
`groupID` int(11) NOT NULL ,
`userID` int(11) NOT NULL,
PRIMARY KEY (`groupID`)
Nö, der Key muss über beide Felder gehen. Die Kombination userID und groupID zusammen ist eindeutig. Ansonsten haben wir wieder ein 1:n und nicht ein n:n.

Ein User kann in mehreren Gruppen sein.
Eine Gruppe kann von mehrere User beinhalten
-> n:n, nicht 1:n

Darum:
Code:
PRIMARY KEY (`userID`, `groupID`)
 
mh ich bin mir grad nicht mehr sicher ist das Tupel zusammen der Primary Key?
Weil Primary verstehe ich gleichzeitig als unique.
In deinem Beispiel hätte ich jetzt gesagt dass userID nur einmal und groupID ebenfalls nur einmal vorkommen kann.
 
Ein Index kann aus mehreren Feldern bestehen. Wenn der Index unique ist, heisst das, dass die Kombination aller Felder des Indexes unique ist.
Der Primary funktioniert wie ein Index...

Hier noch was aus meinem MySQL-Help-File
Ein Primärschlüssel kann ein mehrspaltiger Index sein. Sie können allerdings keinen mehrspaltigen Index mithilfe des Schlüsselattributs PRIMARY KEY in einer Spaltendefinition erstellen. Wenn Sie dies tun, wird nur diese eine Spalte als Primärschlüssel gekennzeichnet. Sie müssen hierzu eine separate PRIMARY KEY(index_col_name, ...)-Klausel verwenden.
 
Zuletzt bearbeitet:
Zurück