2016-04-16 9 views
0

Ich habe eine Website, die Benutzer zu Gruppen zuweist und jeder Benutzer kann in einer unbegrenzten Anzahl von Gruppen sein.MySQL - Speichern von Gruppen der Benutzer ist in

Beispiel:

Benutzer A:

  • Schach Gruppe
  • Streichorchester Gruppe
  • Basketball Gruppe

Benutzer B

  • Fußball Gruppe
  • Schach Gruppe

Derzeit ist meine Tabellenstruktur wie folgt:

Tabelle: login

  • id (Autoinkrement)
  • Benutzername
  • Passwort

Ich betrachte von PHP serialise Array speichert login in der Tabelle eine neue Zeile aufweist. Es wäre jedoch schwierig, die Gruppen eines Benutzers zu bearbeiten, da ich es dann wieder serialisieren und wieder serialisieren müsste.

Oder wäre es besser, die Gruppen vollständig in einer neuen Tabelle zu speichern?

Was ist der schnellste und effizientesten Weg, um die Gruppen zu speichern, die jeder Benutzer gehört?

Diese Methode muss einfach sein beim Aktualisieren der Gruppen und auch schnell beim Abfragen.

Ich hoffe, es gibt eine bessere Methode als serialise.

Antwort

3

Das, was Sie beschreiben, wird eine Viele-zu-Viele-Beziehung genannt (jede Gruppe hat mehrere Mitglieder und jede Person ist Mitglied mehrerer Gruppen). Der übliche Ansatz wäre eine zweite Tabelle für indizierte Gruppen durch eine eindeutige Gruppen-ID und Speichern aller Informationen über jede Gruppe außer Mitgliedschaft und eine dritte Tabelle für die Mitgliedschaft.

Die Mitgliedschaftstabelle (bekannt als "Kreuzungsentität") hat als Spalten die Primärschlüssel der anderen beiden Tabellen, dh login_id und group_id. Sein Primärschlüssel wäre die Verkettung seiner beiden Spalten (PRIMARY KEY (login_id, group_id)) und jede seiner Spalten wäre auch ein Fremdschlüssel, der auf eine der anderen Tabellen verweist.

Diese Situation ist bekannt und gut untersucht, und in der Tat ist es die zweite Sache, die Sie lernen, wenn Sie mit der Normalisierung von Datenbanktabellen beginnen.

könnte ein Beispiel

CREATE TABLE login 
(
    id INT AUTO_INCREMENT, 
    username VARCHAR(255), 
    password VARCHAR(255), 
    -- other columns go here 
    PRIMARY KEY (id) 
); 

CREATE TABLE groups 
(
    id INT AUTO_INCREMENT, 
    name VARCHAR(255), 
    description TEXT, 
    -- other columns go here 
    PRIMARY KEY (id) 
); 

CREATE TABLE membership 
(
    login_id INT, 
    group_id INT, 
    -- possibly more columns, or perhaps not 
    PRIMARY KEY (login_id, group_id), 
    CONSTRAINT member_user FOREIGN KEY (login_id) REFERENCES login (id), 
    CONSTRAINT member_group FOREIGN KEY (group_id) REFERENCES groups (id) 
); 

Die Fremdschlüssel auf membership sicherzustellen, dass ein Benutzer nicht ein Mitglied einer Gruppe, die sowohl, wenn der Benutzer bereits und die Gruppe vorhanden sein kann. Der zusammengesetzte Primärschlüssel für membership stellt sicher, dass eine bestimmte Person nur einmal einer bestimmten Gruppe angehören kann; Wenn Sie diesen Punkt vernachlässigen, kann das zu einigen wirklich seltsamen Problemen führen, wenn Sie später versuchen, die Tabellen abzufragen.

Hoffnung, das hilft.

+0

Danke für den ausführlichen Beitrag! :) – Panda

+0

Ist es möglich, ein Beispiel für die Kreuzungseinheit anzugeben, die meine Situation verwendet? Vielen Dank! – Panda

+1

Dieser Link könnte Ihnen helfen. Alles, was Sie brauchen, ist die Tabelle http://www.phpknowhow.com/mysql/many-to-many-relationships/ –

Verwandte Themen